管理器 API
Manager
是 Go Pip SDK 的核心组件,提供了所有包管理、虚拟环境和项目操作的统一接口。
接口定义
go
type PipManager interface {
// 系统操作
IsInstalled() (bool, error)
Install() error
GetVersion() (string, error)
SetTimeout(timeout time.Duration)
SetRetries(retries int)
// 包操作
InstallPackage(pkg *PackageSpec) error
UninstallPackage(name string) error
ListPackages() ([]*Package, error)
ShowPackage(name string) (*PackageInfo, error)
SearchPackages(query string) ([]*SearchResult, error)
FreezePackages() ([]*Package, error)
InstallRequirements(path string) error
GenerateRequirements(path string) error
// 虚拟环境操作
CreateVenv(path string) error
CreateVenvWithOptions(path string, opts *VenvOptions) error
ActivateVenv(path string) error
DeactivateVenv() error
IsVenvActive() (bool, string)
RemoveVenv(path string) error
ListVenvs(baseDir string) ([]*VenvInfo, error)
GetVenvInfo(path string) (*VenvInfo, error)
// 项目操作
InitProject(path string, opts *ProjectOptions) error
ReadProjectConfig(path string) (*ProjectConfig, error)
UpdateProjectVersion(path string, version string) error
BuildProject(path string, opts *BuildOptions) error
// 配置和日志
SetCustomLogger(logger Logger)
SetLogLevel(level LogLevel)
GetConfig() *Config
UpdateConfig(config *Config) error
}
构造函数
NewManager
创建一个新的管理器实例。
go
func NewManager(config *Config) PipManager
参数:
config
- 管理器配置,如果为nil
则使用默认配置
返回值:
PipManager
- 管理器实例
示例:
go
// 使用默认配置
manager := pip.NewManager(nil)
// 使用自定义配置
config := &pip.Config{
PythonPath: "/usr/bin/python3",
Timeout: 60 * time.Second,
LogLevel: "DEBUG",
}
manager := pip.NewManager(config)
NewManagerWithContext
创建一个带上下文的管理器实例。
go
func NewManagerWithContext(ctx context.Context, config *Config) PipManager
参数:
ctx
- 上下文,用于取消操作config
- 管理器配置
返回值:
PipManager
- 管理器实例
示例:
go
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
manager := pip.NewManagerWithContext(ctx, nil)
系统操作
IsInstalled
检查 pip 是否已安装。
go
func (m *Manager) IsInstalled() (bool, error)
返回值:
bool
- 如果 pip 已安装则为 trueerror
- 错误信息
示例:
go
installed, err := manager.IsInstalled()
if err != nil {
log.Fatalf("检查 pip 安装状态失败: %v", err)
}
if !installed {
fmt.Println("Pip 未安装")
}
Install
安装 pip。
go
func (m *Manager) Install() error
返回值:
error
- 错误信息
示例:
go
if err := manager.Install(); err != nil {
log.Fatalf("安装 pip 失败: %v", err)
}
fmt.Println("Pip 安装成功")
GetVersion
获取 pip 版本。
go
func (m *Manager) GetVersion() (string, error)
返回值:
string
- pip 版本号error
- 错误信息
示例:
go
version, err := manager.GetVersion()
if err != nil {
log.Fatalf("获取 pip 版本失败: %v", err)
}
fmt.Printf("Pip 版本: %s\n", version)
配置管理
SetTimeout
设置操作超时时间。
go
func (m *Manager) SetTimeout(timeout time.Duration)
参数:
timeout
- 超时时间
示例:
go
// 设置 2 分钟超时
manager.SetTimeout(2 * time.Minute)
SetRetries
设置重试次数。
go
func (m *Manager) SetRetries(retries int)
参数:
retries
- 重试次数
示例:
go
// 设置最多重试 5 次
manager.SetRetries(5)
GetConfig
获取当前配置。
go
func (m *Manager) GetConfig() *Config
返回值:
*Config
- 当前配置
示例:
go
config := manager.GetConfig()
fmt.Printf("Python 路径: %s\n", config.PythonPath)
fmt.Printf("超时时间: %v\n", config.Timeout)
UpdateConfig
更新配置。
go
func (m *Manager) UpdateConfig(config *Config) error
参数:
config
- 新的配置
返回值:
error
- 错误信息
示例:
go
newConfig := &pip.Config{
Timeout: 120 * time.Second,
DefaultIndex: "https://pypi.tuna.tsinghua.edu.cn/simple/",
}
if err := manager.UpdateConfig(newConfig); err != nil {
log.Fatalf("更新配置失败: %v", err)
}
日志管理
SetCustomLogger
设置自定义日志记录器。
go
func (m *Manager) SetCustomLogger(logger Logger)
参数:
logger
- 自定义日志记录器
示例:
go
logger, err := pip.NewLogger(&pip.LoggerConfig{
Level: pip.LogLevelDebug,
Output: os.Stdout,
Format: pip.LogFormatJSON,
})
if err != nil {
log.Fatal(err)
}
manager.SetCustomLogger(logger)
SetLogLevel
设置日志级别。
go
func (m *Manager) SetLogLevel(level LogLevel)
参数:
level
- 日志级别
示例:
go
// 设置为调试级别
manager.SetLogLevel(pip.LogLevelDebug)
// 设置为错误级别
manager.SetLogLevel(pip.LogLevelError)
实用方法
AddTrustedHost
添加受信任的主机。
go
func (m *Manager) AddTrustedHost(host string) error
参数:
host
- 主机名
返回值:
error
- 错误信息
示例:
go
if err := manager.AddTrustedHost("pypi.tuna.tsinghua.edu.cn"); err != nil {
log.Printf("添加受信任主机失败: %v", err)
}
GetPythonPath
获取当前使用的 Python 路径。
go
func (m *Manager) GetPythonPath() (string, error)
返回值:
string
- Python 可执行文件路径error
- 错误信息
示例:
go
pythonPath, err := manager.GetPythonPath()
if err != nil {
log.Fatalf("获取 Python 路径失败: %v", err)
}
fmt.Printf("Python 路径: %s\n", pythonPath)
GetPipPath
获取当前使用的 pip 路径。
go
func (m *Manager) GetPipPath() (string, error)
返回值:
string
- pip 可执行文件路径error
- 错误信息
示例:
go
pipPath, err := manager.GetPipPath()
if err != nil {
log.Fatalf("获取 pip 路径失败: %v", err)
}
fmt.Printf("Pip 路径: %s\n", pipPath)
状态查询
GetStatus
获取管理器状态信息。
go
func (m *Manager) GetStatus() (*ManagerStatus, error)
返回值:
*ManagerStatus
- 状态信息error
- 错误信息
示例:
go
status, err := manager.GetStatus()
if err != nil {
log.Fatalf("获取状态失败: %v", err)
}
fmt.Printf("Python 版本: %s\n", status.PythonVersion)
fmt.Printf("Pip 版本: %s\n", status.PipVersion)
fmt.Printf("虚拟环境: %s\n", status.VirtualEnv)
fmt.Printf("已安装包数量: %d\n", status.PackageCount)
IsHealthy
检查管理器是否处于健康状态。
go
func (m *Manager) IsHealthy() (bool, []string, error)
返回值:
bool
- 是否健康[]string
- 健康检查问题列表error
- 错误信息
示例:
go
healthy, issues, err := manager.IsHealthy()
if err != nil {
log.Fatalf("健康检查失败: %v", err)
}
if !healthy {
fmt.Println("发现以下问题:")
for _, issue := range issues {
fmt.Printf("- %s\n", issue)
}
}
高级功能
ExecuteCommand
执行自定义 pip 命令。
go
func (m *Manager) ExecuteCommand(args []string) (*CommandResult, error)
参数:
args
- 命令参数
返回值:
*CommandResult
- 命令执行结果error
- 错误信息
示例:
go
// 执行 pip list --format=json
result, err := manager.ExecuteCommand([]string{"list", "--format=json"})
if err != nil {
log.Fatalf("执行命令失败: %v", err)
}
fmt.Printf("输出: %s\n", result.Stdout)
fmt.Printf("错误: %s\n", result.Stderr)
fmt.Printf("退出代码: %d\n", result.ExitCode)
Clone
克隆管理器实例。
go
func (m *Manager) Clone() PipManager
返回值:
PipManager
- 克隆的管理器实例
示例:
go
// 克隆管理器用于不同的配置
clonedManager := manager.Clone()
clonedManager.SetTimeout(30 * time.Second)
错误处理
所有管理器方法都返回详细的错误信息。使用 pip.IsErrorType()
函数检查特定错误类型:
go
if err := manager.InstallPackage(pkg); err != nil {
switch {
case pip.IsErrorType(err, pip.ErrorTypePythonNotFound):
fmt.Println("Python 未找到")
case pip.IsErrorType(err, pip.ErrorTypePipNotFound):
fmt.Println("Pip 未找到")
case pip.IsErrorType(err, pip.ErrorTypeNetworkError):
fmt.Println("网络错误")
case pip.IsErrorType(err, pip.ErrorTypePackageNotFound):
fmt.Println("包未找到")
default:
fmt.Printf("其他错误: %v\n", err)
}
}
线程安全
Manager
类型是线程安全的,可以在多个 goroutine 中同时使用:
go
var wg sync.WaitGroup
packages := []string{"requests", "click", "pydantic"}
for _, name := range packages {
wg.Add(1)
go func(packageName string) {
defer wg.Done()
pkg := &pip.PackageSpec{Name: packageName}
if err := manager.InstallPackage(pkg); err != nil {
fmt.Printf("安装 %s 失败: %v\n", packageName, err)
}
}(name)
}
wg.Wait()
最佳实践
- 重用管理器实例:创建一个管理器实例并在整个应用程序中重用它
- 适当的超时设置:根据网络条件设置合理的超时时间
- 错误处理:始终检查和处理错误
- 日志记录:在生产环境中启用适当的日志级别
- 资源清理:在适当的时候停用虚拟环境和关闭日志记录器