项目管理
Go Pip SDK 提供了强大的项目管理功能,帮助您快速初始化 Python 项目,设置标准的项目结构,并管理项目依赖。
项目初始化
基本项目初始化
go
package main
import (
"log"
"github.com/scagogogo/go-pip-sdk/pkg/pip"
)
func main() {
manager := pip.NewManager(nil)
// 基本项目选项
opts := &pip.ProjectOptions{
Name: "my-awesome-project",
Version: "0.1.0",
Description: "一个很棒的 Python 项目",
Author: "您的姓名",
AuthorEmail: "your.email@example.com",
License: "MIT",
}
// 初始化项目
projectPath := "./my-project"
if err := manager.InitProject(projectPath, opts); err != nil {
log.Fatalf("初始化项目失败: %v", err)
}
fmt.Println("项目初始化成功!")
}
完整项目配置
go
opts := &pip.ProjectOptions{
// 基本信息
Name: "advanced-python-project",
Version: "1.0.0",
Description: "一个高级的 Python 项目示例",
Author: "开发团队",
AuthorEmail: "team@example.com",
License: "MIT",
// 项目 URL
Homepage: "https://github.com/username/project",
Repository: "https://github.com/username/project.git",
// Python 版本要求
PythonRequires: ">=3.8",
// 依赖管理
Dependencies: []string{
"requests>=2.25.0",
"click>=7.0",
"pydantic>=1.8.0",
},
DevDependencies: []string{
"pytest>=6.0",
"black>=21.0",
"flake8>=3.8",
"mypy>=0.812",
},
// 虚拟环境
CreateVenv: true,
VenvPath: "./venv",
// 项目结构
CreateSrc: true,
CreateTests: true,
CreateDocs: true,
// 配置文件
CreateSetupPy: true,
CreatePyprojectToml: true,
CreateManifestIn: true,
CreateGitignore: true,
CreateReadme: true,
// CI/CD
CreateGithubActions: true,
CreateDockerfile: true,
}
if err := manager.InitProject("./advanced-project", opts); err != nil {
log.Fatalf("初始化高级项目失败: %v", err)
}
项目结构
标准项目结构
初始化后的项目将具有以下结构:
my-project/
├── src/
│ └── my_project/
│ ├── __init__.py
│ └── main.py
├── tests/
│ ├── __init__.py
│ └── test_main.py
├── docs/
│ ├── index.md
│ └── api.md
├── venv/ # 虚拟环境(如果启用)
├── .github/
│ └── workflows/
│ └── ci.yml # GitHub Actions(如果启用)
├── setup.py # 包安装脚本
├── pyproject.toml # 现代 Python 项目配置
├── requirements.txt # 生产依赖
├── dev-requirements.txt # 开发依赖
├── MANIFEST.in # 包含文件清单
├── .gitignore # Git 忽略文件
├── README.md # 项目说明
├── LICENSE # 许可证文件
└── Dockerfile # Docker 配置(如果启用)
自定义项目模板
go
// 创建自定义项目模板
template := &pip.ProjectTemplate{
Name: "web-api-template",
Files: map[string]string{
"app/__init__.py": "",
"app/main.py": webApiMainTemplate,
"app/models.py": modelsTemplate,
"app/routes.py": routesTemplate,
"config.py": configTemplate,
"docker-compose.yml": dockerComposeTemplate,
},
Dependencies: []string{
"fastapi>=0.68.0",
"uvicorn>=0.15.0",
"sqlalchemy>=1.4.0",
"alembic>=1.7.0",
},
}
// 使用自定义模板初始化项目
opts := &pip.ProjectOptions{
Template: template,
Name: "my-web-api",
Version: "0.1.0",
}
if err := manager.InitProjectFromTemplate("./my-api", opts); err != nil {
log.Fatalf("从模板初始化项目失败: %v", err)
}
依赖管理
添加依赖
go
// 添加生产依赖
if err := manager.AddDependency("./my-project", "numpy", ">=1.20.0"); err != nil {
log.Fatalf("添加依赖失败: %v", err)
}
// 添加开发依赖
if err := manager.AddDevDependency("./my-project", "pytest-cov", ">=2.12.0"); err != nil {
log.Fatalf("添加开发依赖失败: %v", err)
}
移除依赖
go
// 移除依赖
if err := manager.RemoveDependency("./my-project", "old-package"); err != nil {
log.Fatalf("移除依赖失败: %v", err)
}
更新依赖
go
// 更新所有依赖到最新版本
if err := manager.UpdateDependencies("./my-project"); err != nil {
log.Fatalf("更新依赖失败: %v", err)
}
// 更新特定依赖
if err := manager.UpdateDependency("./my-project", "requests"); err != nil {
log.Fatalf("更新 requests 失败: %v", err)
}
锁定依赖版本
go
// 生成锁定文件(类似 poetry.lock 或 Pipfile.lock)
if err := manager.LockDependencies("./my-project"); err != nil {
log.Fatalf("锁定依赖失败: %v", err)
}
// 从锁定文件安装精确版本
if err := manager.InstallFromLock("./my-project"); err != nil {
log.Fatalf("从锁定文件安装失败: %v", err)
}
项目配置管理
读取项目配置
go
// 读取项目配置
config, err := manager.ReadProjectConfig("./my-project")
if err != nil {
log.Fatalf("读取项目配置失败: %v", err)
}
fmt.Printf("项目名称: %s\n", config.Name)
fmt.Printf("版本: %s\n", config.Version)
fmt.Printf("依赖数量: %d\n", len(config.Dependencies))
更新项目配置
go
// 更新项目版本
if err := manager.UpdateProjectVersion("./my-project", "1.1.0"); err != nil {
log.Fatalf("更新项目版本失败: %v", err)
}
// 更新项目描述
if err := manager.UpdateProjectDescription("./my-project", "更新的项目描述"); err != nil {
log.Fatalf("更新项目描述失败: %v", err)
}
项目构建和打包
构建项目
go
// 构建项目包
buildOpts := &pip.BuildOptions{
OutputDir: "./dist",
Format: "wheel", // 或 "sdist"
Clean: true,
}
if err := manager.BuildProject("./my-project", buildOpts); err != nil {
log.Fatalf("构建项目失败: %v", err)
}
发布项目
go
// 发布到 PyPI
publishOpts := &pip.PublishOptions{
Repository: "pypi", // 或 "testpypi"
Username: "your-username",
Password: "your-password", // 建议使用环境变量
}
if err := manager.PublishProject("./my-project", publishOpts); err != nil {
log.Fatalf("发布项目失败: %v", err)
}
项目验证和测试
验证项目结构
go
// 验证项目结构是否正确
issues, err := manager.ValidateProject("./my-project")
if err != nil {
log.Fatalf("验证项目失败: %v", err)
}
if len(issues) > 0 {
fmt.Println("发现以下问题:")
for _, issue := range issues {
fmt.Printf("- %s: %s\n", issue.Type, issue.Message)
}
} else {
fmt.Println("项目结构验证通过!")
}
运行项目测试
go
// 运行项目测试
testOpts := &pip.TestOptions{
Coverage: true,
Verbose: true,
FailFast: false,
TestPattern: "test_*.py",
}
result, err := manager.RunTests("./my-project", testOpts)
if err != nil {
log.Fatalf("运行测试失败: %v", err)
}
fmt.Printf("测试结果: %d 通过, %d 失败\n", result.Passed, result.Failed)
fmt.Printf("代码覆盖率: %.2f%%\n", result.Coverage)
项目模板
内置模板
SDK 提供了多种内置项目模板:
go
// 列出可用模板
templates, err := manager.ListProjectTemplates()
if err != nil {
log.Fatalf("列出模板失败: %v", err)
}
fmt.Println("可用模板:")
for _, template := range templates {
fmt.Printf("- %s: %s\n", template.Name, template.Description)
}
// 使用特定模板
opts := &pip.ProjectOptions{
TemplateName: "fastapi-web-api",
Name: "my-api-project",
Version: "0.1.0",
}
if err := manager.InitProject("./my-api", opts); err != nil {
log.Fatalf("从模板初始化失败: %v", err)
}
创建自定义模板
go
// 创建自定义模板
template := &pip.ProjectTemplate{
Name: "my-custom-template",
Description: "我的自定义项目模板",
Version: "1.0.0",
// 模板文件
Files: map[string]string{
"{{.Name}}/__init__.py": initTemplate,
"{{.Name}}/main.py": mainTemplate,
"tests/test_{{.Name}}.py": testTemplate,
"README.md": readmeTemplate,
},
// 默认依赖
Dependencies: []string{
"click>=7.0",
"rich>=10.0",
},
DevDependencies: []string{
"pytest>=6.0",
"black>=21.0",
},
// 模板变量
Variables: map[string]interface{}{
"DefaultPort": 8000,
"UseAsync": true,
},
}
// 注册模板
if err := manager.RegisterTemplate(template); err != nil {
log.Fatalf("注册模板失败: %v", err)
}
项目迁移
从现有项目迁移
go
// 从 requirements.txt 迁移到现代项目结构
migrationOpts := &pip.MigrationOptions{
SourceFormat: "requirements",
TargetFormat: "pyproject",
CreateVenv: true,
UpdateGitignore: true,
}
if err := manager.MigrateProject("./legacy-project", migrationOpts); err != nil {
log.Fatalf("项目迁移失败: %v", err)
}
项目升级
go
// 升级项目到新的 SDK 版本
upgradeOpts := &pip.UpgradeOptions{
UpdateDependencies: true,
UpdateTemplates: true,
BackupOriginal: true,
}
if err := manager.UpgradeProject("./my-project", upgradeOpts); err != nil {
log.Fatalf("项目升级失败: %v", err)
}
最佳实践
1. 项目命名
go
// 使用有意义的项目名称
opts := &pip.ProjectOptions{
Name: "user-authentication-service", // 好
// Name: "project1", // 不好
}
2. 版本管理
go
// 遵循语义化版本
opts := &pip.ProjectOptions{
Version: "1.2.3", // 主版本.次版本.修订版本
}
3. 依赖管理
go
// 指定版本范围而不是精确版本
opts := &pip.ProjectOptions{
Dependencies: []string{
"requests>=2.25.0,<3.0.0", // 好
// "requests==2.25.1", // 过于严格
},
}
4. 项目文档
go
// 始终包含完整的项目文档
opts := &pip.ProjectOptions{
CreateReadme: true,
CreateDocs: true,
CreateChangelog: true,
}
故障排除
常见问题
项目初始化失败
- 检查目录权限
- 确保目标目录不存在或为空
- 验证项目名称有效性
依赖安装失败
- 检查网络连接
- 验证包名称和版本
- 检查 Python 版本兼容性
构建失败
- 确保所有必需文件存在
- 检查 setup.py 或 pyproject.toml 配置
- 验证依赖完整性
调试技巧
go
// 启用详细日志
config := &pip.Config{
LogLevel: "DEBUG",
}
manager := pip.NewManager(config)
// 验证项目状态
status, err := manager.GetProjectStatus("./my-project")
if err != nil {
log.Printf("获取项目状态失败: %v", err)
} else {
fmt.Printf("项目状态: %+v\n", status)
}