Skip to content

🔧 自动安装机制

Composer Skills 最省心的特性之一:目标机器没装 Composer?SDK 自己装。 本页讲清楚这条"检测 → 检查 PHP → 安装 → 验证 → 就绪"链路是怎么工作的,以及如何在代码里触发它。

🔄 流程总览

Options.AutoInstall = true(默认开启)时,创建 *Composer 实例会触发如下流程:

默认就开启

composer.DefaultOptions() 返回的 Options 已设 AutoInstall: true,所以下面这一行就包含了完整的检测与安装逻辑:

go
comp, err := composer.New(composer.DefaultOptions())

🚀 QuickSetup:一步到位

如果你嫌手写 New + SetWorkingDir 太啰嗦,用 QuickSetup 一步完成检测、安装与实例创建:

go
package main

import (
    "fmt"
    "log"

    "github.com/scagogogo/composer-skills/pkg/composer"
)

func main() {
    // workingDir + autoInstall,一步搞定
    comp, err := composer.QuickSetup("/path/to/php/project", true)
    if err != nil {
        log.Fatalf("快速设置失败: %v", err)
    }

    // 实例已就绪
    ver, _ := comp.GetVersion()
    fmt.Printf("✅ Composer 就绪,版本: %s\n", ver)
}

需要观察安装过程?用带进度回调的 QuickSetupWithProgress

go
comp, installResult, err := composer.QuickSetupWithProgress(
    "/path/to/php/project",
    func(stage string, percent int) {
        fmt.Printf("[%s] %d%%\n", stage, percent)
    },
)

🧩 底层组件

自动安装链路由两个底层包支撑,你也可以单独使用它们:

检测器 Detector

包路径github.com/scagogogo/composer-skills/pkg/detector

跨操作系统查找已安装的 Composer:扫描 PATH、常见安装路径、COMPOSER 环境变量,并用 which/where 兜底。

go
d := detector.NewDetector()
if d.IsInstalled() {
    path, _ := d.Detect()
    fmt.Printf("Composer 位于: %s\n", path)
} else {
    fmt.Println("未检测到 Composer")
}

详见 Detector 文档

安装器 Installer

包路径github.com/scagogogo/composer-skills/pkg/installer

负责实际下载与安装,支持 Linux 发行版识别、macOS brew、Windows phar 包装,并能顺带安装 PHP。

go
inst := installer.NewInstaller(installer.SmartConfig())
if err := inst.Install(); err != nil {
    log.Fatal(err)
}

两个常用配置:

  • installer.DefaultConfig() —— 默认配置。
  • installer.SmartConfig() —— 智能配置:按平台自动选择最佳安装方式(brew/apt/直接下载)。

详见 Installer 文档

🖥️ 智能默认:按平台选择

安装器会根据运行平台走不同路径,这就是"智能默认":

平台首选策略兜底策略
🐧 Linux发行版包管理器(apt/dnf/pacman)下载 composer.phar + 包装脚本
🍎 macOSbrew install composer下载 composer.phar
🪟 Windows下载 composer.phar + .cmd 包装同左

Linux 上还能识别发行版:DetectLinuxDistro() 解析 /etc/os-release,决定用 aptdnf 还是其他。

需要 sudo?

通过包管理器全局安装可能需要权限。安装器提供 useSudo 参数控制是否加 sudo。在 CI 容器里通常以 root 运行,无需 sudo。

⏱️ 关掉自动安装

某些场景(生产环境、严格审计)你不希望程序偷偷装东西。把 AutoInstall 关掉即可:

go
options := composer.DefaultOptions()
options.AutoInstall = false
comp, err := composer.New(options)
// 若 Composer 不存在,err 会告诉你

🧭 下一步

基于 MIT 许可证发布