Skip to content

基本操作示例

本页面展示 Go Composer SDK 的基本操作示例,包括创建实例、检查安装、获取版本等核心功能。

创建 Composer 实例

使用默认配置

go
package main

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

func main() {
    // 使用默认选项创建 Composer 实例
    comp, err := composer.New(composer.DefaultOptions())
    if err != nil {
        log.Fatalf("创建 Composer 实例失败: %v", err)
    }
    
    fmt.Println("✅ Composer 实例创建成功!")
}

自定义配置

go
package main

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

func main() {
    // 自定义配置选项
    options := composer.Options{
        ExecutablePath:  "/usr/local/bin/composer",
        WorkingDir:      "/path/to/your/php/project",
        AutoInstall:     true,
        DefaultTimeout:  5 * time.Minute,
    }
    
    comp, err := composer.New(options)
    if err != nil {
        log.Fatalf("创建 Composer 实例失败: %v", err)
    }
    
    fmt.Println("✅ 自定义 Composer 实例创建成功!")
}

检查 Composer 安装

基本检查

go
func checkComposerInstallation() {
    comp, err := composer.New(composer.DefaultOptions())
    if err != nil {
        log.Fatalf("创建 Composer 实例失败: %v", err)
    }
    
    // 检查 Composer 是否已安装
    if comp.IsInstalled() {
        fmt.Println("✅ Composer 已安装")
        
        // 获取版本信息
        version, err := comp.GetVersion()
        if err != nil {
            log.Printf("获取版本失败: %v", err)
        } else {
            fmt.Printf("📦 Composer 版本: %s\n", version)
        }
    } else {
        fmt.Println("❌ Composer 未安装")
        fmt.Println("💡 提示: 启用 AutoInstall 选项可以自动安装 Composer")
    }
}

详细检查

go
func detailedComposerCheck() {
    comp, err := composer.New(composer.DefaultOptions())
    if err != nil {
        log.Fatalf("创建 Composer 实例失败: %v", err)
    }
    
    fmt.Println("🔍 正在检查 Composer 安装状态...")
    
    // 检查安装状态
    if !comp.IsInstalled() {
        fmt.Println("❌ Composer 未安装")
        return
    }
    
    fmt.Println("✅ Composer 已安装")
    
    // 获取版本
    if version, err := comp.GetVersion(); err == nil {
        fmt.Printf("📦 版本: %s\n", version)
    }
    
    // 获取可执行文件路径
    execPath := comp.GetExecutablePath()
    fmt.Printf("📁 可执行文件路径: %s\n", execPath)
    
    // 获取工作目录
    workDir := comp.GetWorkingDir()
    fmt.Printf("📂 工作目录: %s\n", workDir)
    
    // 运行诊断
    fmt.Println("\n🔧 运行诊断...")
    if output, err := comp.Diagnose(); err == nil {
        fmt.Printf("诊断结果:\n%s\n", output)
    } else {
        fmt.Printf("诊断失败: %v\n", err)
    }
}

配置工作目录

设置项目目录

go
func setupWorkingDirectory() {
    comp, err := composer.New(composer.DefaultOptions())
    if err != nil {
        log.Fatalf("创建 Composer 实例失败: %v", err)
    }
    
    // 设置工作目录
    projectPath := "/path/to/your/php/project"
    comp.SetWorkingDir(projectPath)
    
    fmt.Printf("📂 工作目录已设置为: %s\n", comp.GetWorkingDir())
    
    // 验证目录中是否有 composer.json
    if _, err := os.Stat(filepath.Join(projectPath, "composer.json")); err == nil {
        fmt.Println("✅ 找到 composer.json 文件")
    } else {
        fmt.Println("⚠️  未找到 composer.json 文件")
        fmt.Println("💡 提示: 您可能需要先初始化项目或切换到正确的目录")
    }
}

动态切换目录

go
func switchBetweenProjects() {
    comp, err := composer.New(composer.DefaultOptions())
    if err != nil {
        log.Fatalf("创建 Composer 实例失败: %v", err)
    }
    
    projects := []string{
        "/path/to/project1",
        "/path/to/project2",
        "/path/to/project3",
    }
    
    for _, project := range projects {
        fmt.Printf("\n🔄 切换到项目: %s\n", project)
        comp.SetWorkingDir(project)
        
        // 检查项目状态
        if _, err := os.Stat(filepath.Join(project, "composer.json")); err == nil {
            fmt.Println("✅ 有效的 Composer 项目")
            
            // 可以在这里执行项目特定的操作
            if err := comp.Validate(); err == nil {
                fmt.Println("✅ composer.json 验证通过")
            } else {
                fmt.Printf("❌ composer.json 验证失败: %v\n", err)
            }
        } else {
            fmt.Println("❌ 不是有效的 Composer 项目")
        }
    }
}

环境变量配置

基本环境配置

go
func configureEnvironment() {
    comp, err := composer.New(composer.DefaultOptions())
    if err != nil {
        log.Fatalf("创建 Composer 实例失败: %v", err)
    }
    
    // 设置环境变量
    comp.SetEnv([]string{
        "COMPOSER_MEMORY_LIMIT=-1",           // 移除内存限制
        "COMPOSER_PROCESS_TIMEOUT=600",       // 10分钟超时
        "COMPOSER_CACHE_DIR=/tmp/composer",   // 自定义缓存目录
        "COMPOSER_HOME=/opt/composer",        // 自定义主目录
    })
    
    fmt.Println("✅ 环境变量配置完成")
    
    // 测试配置
    if version, err := comp.GetVersion(); err == nil {
        fmt.Printf("📦 Composer 版本: %s\n", version)
    }
}

开发环境配置

go
func setupDevelopmentEnvironment() {
    comp, err := composer.New(composer.DefaultOptions())
    if err != nil {
        log.Fatalf("创建 Composer 实例失败: %v", err)
    }
    
    // 开发环境特定配置
    comp.SetEnv([]string{
        "COMPOSER_MEMORY_LIMIT=-1",
        "COMPOSER_PROCESS_TIMEOUT=300",       // 开发环境较短超时
        "COMPOSER_DISCARD_CHANGES=true",      // 自动丢弃更改
        "COMPOSER_PREFER_STABLE=false",       // 允许开发版本
        "COMPOSER_MINIMUM_STABILITY=dev",
    })
    
    fmt.Println("🛠️  开发环境配置完成")
    
    // 设置开发项目目录
    comp.SetWorkingDir("./my-dev-project")
    
    fmt.Println("✅ 开发环境就绪")
}

超时和上下文管理

设置超时

go
func timeoutExample() {
    comp, err := composer.New(composer.DefaultOptions())
    if err != nil {
        log.Fatalf("创建 Composer 实例失败: %v", err)
    }
    
    // 设置默认超时
    comp.SetTimeout(2 * time.Minute)
    
    fmt.Println("⏰ 超时设置为 2 分钟")
    
    // 执行可能耗时的操作
    start := time.Now()
    if version, err := comp.GetVersion(); err == nil {
        duration := time.Since(start)
        fmt.Printf("✅ 获取版本成功: %s (耗时: %v)\n", version, duration)
    } else {
        fmt.Printf("❌ 操作失败: %v\n", err)
    }
}

使用上下文控制

go
func contextExample() {
    comp, err := composer.New(composer.DefaultOptions())
    if err != nil {
        log.Fatalf("创建 Composer 实例失败: %v", err)
    }
    
    // 创建带超时的上下文
    ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
    defer cancel()
    
    fmt.Println("🔄 使用上下文执行命令...")
    
    // 使用上下文执行命令
    output, err := comp.RunWithContext(ctx, "--version")
    if err != nil {
        if errors.Is(err, context.DeadlineExceeded) {
            fmt.Println("⏰ 操作超时")
        } else {
            fmt.Printf("❌ 操作失败: %v\n", err)
        }
        return
    }
    
    fmt.Printf("✅ 命令执行成功:\n%s\n", output)
}

错误处理最佳实践

基本错误处理

go
func basicErrorHandling() {
    comp, err := composer.New(composer.DefaultOptions())
    if err != nil {
        log.Fatalf("创建 Composer 实例失败: %v", err)
    }
    
    // 设置一个可能不存在的工作目录
    comp.SetWorkingDir("/nonexistent/directory")
    
    // 尝试执行操作并处理错误
    if version, err := comp.GetVersion(); err != nil {
        fmt.Printf("❌ 获取版本失败: %v\n", err)
        
        // 根据错误类型采取不同的处理策略
        if strings.Contains(err.Error(), "not found") {
            fmt.Println("💡 建议: 检查 Composer 是否已正确安装")
        } else if strings.Contains(err.Error(), "permission") {
            fmt.Println("💡 建议: 检查文件权限")
        } else {
            fmt.Println("💡 建议: 检查网络连接和配置")
        }
    } else {
        fmt.Printf("✅ Composer 版本: %s\n", version)
    }
}

健壮的错误处理

go
func robustErrorHandling() {
    comp, err := composer.New(composer.DefaultOptions())
    if err != nil {
        log.Fatalf("创建 Composer 实例失败: %v", err)
    }
    
    // 多步骤操作的错误处理
    steps := []struct {
        name string
        fn   func() error
    }{
        {"检查安装", func() error {
            if !comp.IsInstalled() {
                return fmt.Errorf("Composer 未安装")
            }
            return nil
        }},
        {"获取版本", func() error {
            _, err := comp.GetVersion()
            return err
        }},
        {"验证配置", func() error {
            return comp.Validate()
        }},
    }
    
    for _, step := range steps {
        fmt.Printf("🔄 执行步骤: %s\n", step.name)
        
        if err := step.fn(); err != nil {
            fmt.Printf("❌ 步骤 '%s' 失败: %v\n", step.name, err)
            
            // 决定是否继续执行后续步骤
            if step.name == "检查安装" {
                fmt.Println("🛑 关键步骤失败,停止执行")
                return
            }
            
            fmt.Println("⚠️  非关键步骤失败,继续执行")
            continue
        }
        
        fmt.Printf("✅ 步骤 '%s' 成功\n", step.name)
    }
    
    fmt.Println("🎉 所有步骤执行完成")
}

完整示例

综合基本操作示例

go
package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "path/filepath"
    "time"
    
    "github.com/scagogogo/go-composer-sdk/pkg/composer"
)

func main() {
    fmt.Println("🚀 Go Composer SDK 基本操作示例")
    fmt.Println("=====================================")
    
    // 1. 创建实例
    fmt.Println("\n1️⃣  创建 Composer 实例")
    comp, err := createComposerInstance()
    if err != nil {
        log.Fatalf("创建实例失败: %v", err)
    }
    
    // 2. 检查安装
    fmt.Println("\n2️⃣  检查 Composer 安装")
    checkInstallation(comp)
    
    // 3. 配置环境
    fmt.Println("\n3️⃣  配置环境")
    configureComposer(comp)
    
    // 4. 执行基本命令
    fmt.Println("\n4️⃣  执行基本命令")
    executeBasicCommands(comp)
    
    fmt.Println("\n🎉 示例执行完成!")
}

func createComposerInstance() (*composer.Composer, error) {
    options := composer.DefaultOptions()
    options.DefaultTimeout = 2 * time.Minute
    
    comp, err := composer.New(options)
    if err != nil {
        return nil, err
    }
    
    fmt.Println("✅ Composer 实例创建成功")
    return comp, nil
}

func checkInstallation(comp *composer.Composer) {
    if !comp.IsInstalled() {
        fmt.Println("❌ Composer 未安装")
        return
    }
    
    fmt.Println("✅ Composer 已安装")
    
    if version, err := comp.GetVersion(); err == nil {
        fmt.Printf("📦 版本: %s\n", version)
    }
}

func configureComposer(comp *composer.Composer) {
    // 设置环境变量
    comp.SetEnv([]string{
        "COMPOSER_MEMORY_LIMIT=-1",
        "COMPOSER_PROCESS_TIMEOUT=300",
    })
    
    // 设置工作目录(如果存在)
    if wd, err := os.Getwd(); err == nil {
        comp.SetWorkingDir(wd)
        fmt.Printf("📂 工作目录: %s\n", comp.GetWorkingDir())
    }
    
    fmt.Println("✅ 环境配置完成")
}

func executeBasicCommands(comp *composer.Composer) {
    // 使用上下文执行命令
    ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
    defer cancel()
    
    commands := []string{"--version", "--help"}
    
    for _, cmd := range commands {
        fmt.Printf("🔄 执行命令: composer %s\n", cmd)
        
        if output, err := comp.RunWithContext(ctx, cmd); err == nil {
            // 只显示输出的前几行
            lines := strings.Split(output, "\n")
            if len(lines) > 3 {
                lines = lines[:3]
                lines = append(lines, "...")
            }
            fmt.Printf("📄 输出: %s\n", strings.Join(lines, " | "))
        } else {
            fmt.Printf("❌ 命令失败: %v\n", err)
        }
    }
}

这个示例展示了 Go Composer SDK 的所有基本操作,包括实例创建、安装检查、环境配置、超时处理和错误处理等核心功能。

基于 MIT 许可证发布。