Skip to content

项目初始化示例

本页面提供了详细的项目初始化示例,展示如何使用 Go Pip SDK 创建和管理 Python 项目。

基本项目初始化

简单项目创建

go
package main

import (
    "fmt"
    "log"
    "github.com/scagogogo/go-pip-sdk/pkg/pip"
)

func createBasicProject() {
    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"
    fmt.Printf("初始化项目: %s\n", opts.Name)
    
    if err := manager.InitProject(projectPath, opts); err != nil {
        log.Fatalf("项目初始化失败: %v", err)
    }
    
    fmt.Println("✅ 项目初始化成功!")
    
    // 读取项目配置验证
    config, err := manager.ReadProjectConfig(projectPath)
    if err != nil {
        log.Printf("读取项目配置失败: %v", err)
        return
    }
    
    fmt.Printf("项目名称: %s\n", config.Name)
    fmt.Printf("项目版本: %s\n", config.Version)
    fmt.Printf("项目描述: %s\n", config.Description)
}

完整项目配置

go
func createAdvancedProject() {
    manager := pip.NewManager(nil)
    
    // 完整的项目配置
    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,
    }
    
    projectPath := "./advanced-project"
    fmt.Println("创建高级项目...")
    
    if err := manager.InitProject(projectPath, opts); err != nil {
        log.Fatalf("初始化高级项目失败: %v", err)
    }
    
    fmt.Println("✅ 高级项目创建成功")
    
    // 显示项目结构
    fmt.Println("\n项目结构:")
    showProjectStructure(projectPath)
}

func showProjectStructure(projectPath string) {
    // 这里可以实现显示项目目录结构的逻辑
    fmt.Printf("📁 %s/\n", projectPath)
    fmt.Println("├── src/")
    fmt.Println("│   └── advanced_project/")
    fmt.Println("│       ├── __init__.py")
    fmt.Println("│       └── main.py")
    fmt.Println("├── tests/")
    fmt.Println("│   ├── __init__.py")
    fmt.Println("│   └── test_main.py")
    fmt.Println("├── docs/")
    fmt.Println("├── venv/")
    fmt.Println("├── .github/workflows/")
    fmt.Println("├── setup.py")
    fmt.Println("├── pyproject.toml")
    fmt.Println("├── requirements.txt")
    fmt.Println("├── dev-requirements.txt")
    fmt.Println("├── .gitignore")
    fmt.Println("├── README.md")
    fmt.Println("└── Dockerfile")
}

项目模板

使用内置模板

go
func createProjectFromTemplate() {
    manager := pip.NewManager(nil)
    
    // 列出可用模板
    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",
        Author:       "API 开发者",
        AuthorEmail:  "api@example.com",
    }
    
    if err := manager.InitProject("./my-api", opts); err != nil {
        log.Fatalf("从模板初始化失败: %v", err)
    }
    
    fmt.Println("✅ 从模板创建项目成功")
}

创建自定义模板

go
func createCustomTemplate() {
    manager := pip.NewManager(nil)
    
    // 定义自定义模板
    template := &pip.ProjectTemplate{
        Name:        "my-custom-template",
        Description: "我的自定义项目模板",
        Version:     "1.0.0",
        
        // 模板文件内容
        Files: map[string]string{
            "{{.Name}}/__init__.py": `"""
{{.Description}}
"""
__version__ = "{{.Version}}"
__author__ = "{{.Author}}"
`,
            "{{.Name}}/main.py": `#!/usr/bin/env python3
"""
{{.Name}} 主模块
"""

import click

@click.command()
@click.option('--name', default='World', help='要问候的名字')
def hello(name):
    """简单的问候程序"""
    click.echo(f'Hello {name}!')

if __name__ == '__main__':
    hello()
`,
            "tests/test_{{.Name}}.py": `import pytest
from {{.Name}}.main import hello

def test_hello():
    """测试 hello 函数"""
    # 这里添加测试代码
    pass
`,
            "README.md": `# {{.Name}}

{{.Description}}

## 安装

\`\`\`bash
pip install -e .
\`\`\`

## 使用

\`\`\`bash
python -m {{.Name}}
\`\`\`

## 开发

\`\`\`bash
pip install -e ".[dev]"
pytest
\`\`\`
`,
        },
        
        // 默认依赖
        Dependencies: []string{
            "click>=7.0",
            "rich>=10.0",
        },
        DevDependencies: []string{
            "pytest>=6.0",
            "black>=21.0",
            "flake8>=3.8",
        },
        
        // 模板变量
        Variables: map[string]interface{}{
            "DefaultPort": 8000,
            "UseAsync":    true,
        },
    }
    
    // 注册模板
    if err := manager.RegisterTemplate(template); err != nil {
        log.Fatalf("注册模板失败: %v", err)
    }
    
    fmt.Println("✅ 自定义模板注册成功")
    
    // 使用自定义模板创建项目
    opts := &pip.ProjectOptions{
        TemplateName: "my-custom-template",
        Name:         "test-project",
        Version:      "0.1.0",
        Description:  "使用自定义模板的测试项目",
        Author:       "模板用户",
        AuthorEmail:  "user@example.com",
    }
    
    if err := manager.InitProject("./test-project", opts); err != nil {
        log.Fatalf("使用自定义模板创建项目失败: %v", err)
    }
    
    fmt.Println("✅ 使用自定义模板创建项目成功")
}

特定类型的项目

Web API 项目

go
func createWebAPIProject() {
    manager := pip.NewManager(nil)
    
    opts := &pip.ProjectOptions{
        Name:        "my-web-api",
        Version:     "0.1.0",
        Description: "FastAPI Web API 项目",
        Author:      "API 开发者",
        AuthorEmail: "api@example.com",
        License:     "MIT",
        
        // Web API 特定依赖
        Dependencies: []string{
            "fastapi>=0.68.0",
            "uvicorn[standard]>=0.15.0",
            "pydantic>=1.8.0",
            "sqlalchemy>=1.4.0",
            "alembic>=1.7.0",
            "python-multipart>=0.0.5",
            "python-jose[cryptography]>=3.3.0",
            "passlib[bcrypt]>=1.7.4",
        },
        DevDependencies: []string{
            "pytest>=6.0",
            "pytest-asyncio>=0.15.0",
            "httpx>=0.24.0",
            "black>=21.0",
            "flake8>=3.8",
            "mypy>=0.812",
        },
        
        CreateVenv:          true,
        CreateSrc:           true,
        CreateTests:         true,
        CreateDocs:          true,
        CreateGithubActions: true,
        CreateDockerfile:    true,
    }
    
    if err := manager.InitProject("./my-web-api", opts); err != nil {
        log.Fatalf("创建 Web API 项目失败: %v", err)
    }
    
    fmt.Println("✅ Web API 项目创建成功")
}

数据科学项目

go
func createDataScienceProject() {
    manager := pip.NewManager(nil)
    
    opts := &pip.ProjectOptions{
        Name:        "data-analysis-project",
        Version:     "0.1.0",
        Description: "数据分析项目",
        Author:      "数据科学家",
        AuthorEmail: "datascientist@example.com",
        License:     "MIT",
        
        // 数据科学依赖
        Dependencies: []string{
            "numpy>=1.20.0",
            "pandas>=1.3.0",
            "matplotlib>=3.4.0",
            "seaborn>=0.11.0",
            "scikit-learn>=1.0.0",
            "jupyter>=1.0.0",
            "ipython>=7.0.0",
            "plotly>=5.0.0",
            "scipy>=1.7.0",
        },
        DevDependencies: []string{
            "pytest>=6.0",
            "black>=21.0",
            "flake8>=3.8",
            "mypy>=0.812",
            "nbqa>=1.1.0",
        },
        
        CreateVenv:  true,
        CreateSrc:   true,
        CreateTests: true,
        CreateDocs:  true,
    }
    
    if err := manager.InitProject("./data-analysis", opts); err != nil {
        log.Fatalf("创建数据科学项目失败: %v", err)
    }
    
    fmt.Println("✅ 数据科学项目创建成功")
}

CLI 工具项目

go
func createCLIProject() {
    manager := pip.NewManager(nil)
    
    opts := &pip.ProjectOptions{
        Name:        "my-cli-tool",
        Version:     "0.1.0",
        Description: "命令行工具项目",
        Author:      "CLI 开发者",
        AuthorEmail: "cli@example.com",
        License:     "MIT",
        
        // CLI 工具依赖
        Dependencies: []string{
            "click>=7.0",
            "rich>=10.0",
            "typer>=0.4.0",
            "pydantic>=1.8.0",
            "toml>=0.10.0",
        },
        DevDependencies: []string{
            "pytest>=6.0",
            "black>=21.0",
            "flake8>=3.8",
            "mypy>=0.812",
            "click-testing>=0.1.0",
        },
        
        CreateVenv:          true,
        CreateSrc:           true,
        CreateTests:         true,
        CreateDocs:          true,
        CreateGithubActions: true,
    }
    
    if err := manager.InitProject("./my-cli-tool", opts); err != nil {
        log.Fatalf("创建 CLI 项目失败: %v", err)
    }
    
    fmt.Println("✅ CLI 工具项目创建成功")
}

项目配置管理

读取和更新项目配置

go
func manageProjectConfig() {
    manager := pip.NewManager(nil)
    projectPath := "./my-project"
    
    // 读取项目配置
    config, err := manager.ReadProjectConfig(projectPath)
    if err != nil {
        log.Fatalf("读取项目配置失败: %v", err)
    }
    
    fmt.Printf("当前项目配置:\n")
    fmt.Printf("  名称: %s\n", config.Name)
    fmt.Printf("  版本: %s\n", config.Version)
    fmt.Printf("  描述: %s\n", config.Description)
    fmt.Printf("  依赖数量: %d\n", len(config.Dependencies))
    
    // 更新项目版本
    newVersion := "1.1.0"
    fmt.Printf("更新项目版本到 %s...\n", newVersion)
    if err := manager.UpdateProjectVersion(projectPath, newVersion); err != nil {
        log.Fatalf("更新项目版本失败: %v", err)
    }
    fmt.Println("✅ 项目版本更新成功")
    
    // 添加新依赖
    fmt.Println("添加新依赖...")
    if err := manager.AddDependency(projectPath, "requests", ">=2.25.0"); err != nil {
        log.Printf("添加依赖失败: %v", err)
    } else {
        fmt.Println("✅ 依赖添加成功")
    }
    
    // 移除依赖
    fmt.Println("移除旧依赖...")
    if err := manager.RemoveDependency(projectPath, "old-package"); err != nil {
        log.Printf("移除依赖失败: %v", err)
    } else {
        fmt.Println("✅ 依赖移除成功")
    }
}

项目验证

go
func validateProject() {
    manager := pip.NewManager(nil)
    projectPath := "./my-project"
    
    fmt.Println("验证项目结构...")
    issues, err := manager.ValidateProject(projectPath)
    if err != nil {
        log.Fatalf("验证项目失败: %v", err)
    }
    
    if len(issues) == 0 {
        fmt.Println("✅ 项目结构验证通过")
    } else {
        fmt.Printf("发现 %d 个问题:\n", len(issues))
        for _, issue := range issues {
            fmt.Printf("- %s: %s\n", issue.Type, issue.Message)
            if issue.Suggestion != "" {
                fmt.Printf("  建议: %s\n", issue.Suggestion)
            }
        }
    }
}

项目构建和发布

构建项目

go
func buildProject() {
    manager := pip.NewManager(nil)
    projectPath := "./my-project"
    
    // 构建配置
    buildOpts := &pip.BuildOptions{
        OutputDir: "./dist",
        Format:    "wheel", // 或 "sdist"
        Clean:     true,
        Verbose:   true,
    }
    
    fmt.Println("构建项目...")
    if err := manager.BuildProject(projectPath, buildOpts); err != nil {
        log.Fatalf("构建项目失败: %v", err)
    }
    
    fmt.Println("✅ 项目构建成功")
    fmt.Println("构建文件位于: ./dist/")
}

发布项目

go
func publishProject() {
    manager := pip.NewManager(nil)
    projectPath := "./my-project"
    
    // 发布到测试 PyPI
    publishOpts := &pip.PublishOptions{
        Repository: "testpypi",
        Username:   "your-username",
        Password:   "your-password", // 建议使用环境变量
    }
    
    fmt.Println("发布到测试 PyPI...")
    if err := manager.PublishProject(projectPath, publishOpts); err != nil {
        log.Fatalf("发布项目失败: %v", err)
    }
    
    fmt.Println("✅ 项目发布成功")
}

项目迁移和升级

迁移现有项目

go
func migrateExistingProject() {
    manager := pip.NewManager(nil)
    
    // 从 requirements.txt 迁移到现代项目结构
    migrationOpts := &pip.MigrationOptions{
        SourceFormat:    "requirements",
        TargetFormat:    "pyproject",
        CreateVenv:      true,
        UpdateGitignore: true,
        BackupOriginal:  true,
    }
    
    fmt.Println("迁移现有项目...")
    if err := manager.MigrateProject("./legacy-project", migrationOpts); err != nil {
        log.Fatalf("项目迁移失败: %v", err)
    }
    
    fmt.Println("✅ 项目迁移成功")
}

升级项目

go
func upgradeProject() {
    manager := pip.NewManager(nil)
    
    upgradeOpts := &pip.UpgradeOptions{
        UpdateDependencies: true,
        UpdateTemplates:    true,
        BackupOriginal:     true,
        Force:              false,
    }
    
    fmt.Println("升级项目...")
    if err := manager.UpgradeProject("./my-project", upgradeOpts); err != nil {
        log.Fatalf("项目升级失败: %v", err)
    }
    
    fmt.Println("✅ 项目升级成功")
}

批量项目操作

批量创建项目

go
func batchCreateProjects() {
    manager := pip.NewManager(nil)
    
    projects := []struct {
        name        string
        projectType string
        description string
    }{
        {"web-api-service", "fastapi", "Web API 服务"},
        {"data-processor", "data-science", "数据处理工具"},
        {"cli-utility", "cli", "命令行工具"},
    }
    
    for _, proj := range projects {
        fmt.Printf("创建项目: %s (%s)\n", proj.name, proj.description)
        
        opts := &pip.ProjectOptions{
            Name:        proj.name,
            Version:     "0.1.0",
            Description: proj.description,
            Author:      "批量创建",
            AuthorEmail: "batch@example.com",
            License:     "MIT",
            CreateVenv:  true,
            CreateSrc:   true,
            CreateTests: true,
        }
        
        // 根据项目类型设置特定依赖
        switch proj.projectType {
        case "fastapi":
            opts.Dependencies = []string{"fastapi>=0.68.0", "uvicorn>=0.15.0"}
        case "data-science":
            opts.Dependencies = []string{"numpy>=1.20.0", "pandas>=1.3.0"}
        case "cli":
            opts.Dependencies = []string{"click>=7.0", "rich>=10.0"}
        }
        
        if err := manager.InitProject("./"+proj.name, opts); err != nil {
            fmt.Printf("❌ 创建 %s 失败: %v\n", proj.name, err)
        } else {
            fmt.Printf("✅ %s 创建成功\n", proj.name)
        }
    }
}

完整示例:项目管理工具

go
package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
    "strings"
    
    "github.com/scagogogo/go-pip-sdk/pkg/pip"
)

func main() {
    manager := pip.NewManager(nil)
    
    for {
        fmt.Println("\n=== Python 项目管理工具 ===")
        fmt.Println("1. 创建新项目")
        fmt.Println("2. 从模板创建项目")
        fmt.Println("3. 验证项目")
        fmt.Println("4. 构建项目")
        fmt.Println("5. 迁移项目")
        fmt.Println("6. 升级项目")
        fmt.Println("7. 退出")
        fmt.Print("请选择操作 (1-7): ")
        
        reader := bufio.NewReader(os.Stdin)
        choice, _ := reader.ReadString('\n')
        choice = strings.TrimSpace(choice)
        
        switch choice {
        case "1":
            createProjectInteractive(manager, reader)
        case "2":
            createFromTemplateInteractive(manager, reader)
        case "3":
            validateProjectInteractive(manager, reader)
        case "4":
            buildProjectInteractive(manager, reader)
        case "5":
            migrateProjectInteractive(manager, reader)
        case "6":
            upgradeProjectInteractive(manager, reader)
        case "7":
            fmt.Println("再见!")
            return
        default:
            fmt.Println("无效选择,请重试")
        }
    }
}

func createProjectInteractive(manager *pip.Manager, reader *bufio.Reader) {
    fmt.Print("项目名称: ")
    name, _ := reader.ReadString('\n')
    name = strings.TrimSpace(name)
    
    fmt.Print("项目描述: ")
    description, _ := reader.ReadString('\n')
    description = strings.TrimSpace(description)
    
    fmt.Print("作者姓名: ")
    author, _ := reader.ReadString('\n')
    author = strings.TrimSpace(author)
    
    fmt.Print("作者邮箱: ")
    email, _ := reader.ReadString('\n')
    email = strings.TrimSpace(email)
    
    opts := &pip.ProjectOptions{
        Name:        name,
        Version:     "0.1.0",
        Description: description,
        Author:      author,
        AuthorEmail: email,
        License:     "MIT",
        CreateVenv:  true,
        CreateSrc:   true,
        CreateTests: true,
        CreateDocs:  true,
    }
    
    projectPath := "./" + name
    if err := manager.InitProject(projectPath, opts); err != nil {
        fmt.Printf("❌ 项目创建失败: %v\n", err)
    } else {
        fmt.Printf("✅ 项目 '%s' 创建成功\n", name)
    }
}

// ... 其他交互函数的实现

下一步

基于 MIT 许可证发布。