Skip to content

🖥️ 跨平台支持

Composer Skills 在 Windows、macOS、Linux 三大平台上一致工作。本页给出支持矩阵,并解释"智能默认"如何按平台选择安装方式。

📊 平台支持矩阵

平台检测 Composer自动安装 Composer自动安装 PHP智能默认策略
🐧 Linux包管理器(apt/dnf/pacman)优先,否则下载 phar
🍎 macOSbrew 优先,否则下载 phar
🪟 Windows⚠️ 有限下载 composer.phar + .cmd 包装脚本

公共能力(所有平台一致):

  • 🌐 Packagist API(pkg/client)—— 纯 Go,平台无关。
  • 🛠️ Composer CLI 封装(pkg/composer)—— 通过 os/exec 调子进程,跨平台一致。
  • 🔧 检测器(pkg/detector)—— 按平台扫描不同路径。

一份代码三平台

你不需要写 if runtime.GOOS == "windows" 分支。SDK 内部已经按平台分文件编译(darwin.go/windows.go/unix.go),对外只暴露统一 API。

🔍 平台检测

检测器针对不同平台扫描不同路径:

go
d := detector.NewDetector()
path, err := d.Detect()
// 内部会:
//   Linux/macOS: 查 PATH、/usr/local/bin、/usr/bin、~/.composer/...,并用 which 兜底
//   Windows:     查 PATH、C:\ProgramData\ComposerSetup\...,并用 where 兜底

detector 包按平台分文件实现:

  • pkg/detector/darwin.go —— macOS 特有路径
  • pkg/detector/windows.go —— Windows 特有路径
  • pkg/detector/unix.go —— 通用 Unix 路径(Linux 共用)

还支持 COMPOSER 环境变量手动指定路径:

go
// 用户可设:COMPOSER=/opt/composer/composer.phar
// 检测器会优先识别这个环境变量

📦 智能默认:按平台选安装方式

安装器(pkg/installer)的 SmartConfig() 会按平台挑最合适的策略:

🐧 Linux

DetectLinuxDistro() 解析 /etc/os-release(兜底用 lsb_release 和已知文件),识别发行版后决定包管理器:

发行版 ID包管理器安装命令
ubuntu / debianaptapt-get install composer
fedora / rhel / centosdnf/yumdnf install composer
alpineapkapk add composer
archpacmanpacman -S composer

包管理器没有的话,兜底下载 composer.phar 并写一个包装脚本到 /usr/local/bin/composer

🍎 macOS

优先 brew install composer;没有 brew 时下载 phar。

🪟 Windows

下载 composer.phar 到固定目录,再生成一个 .cmd 包装脚本,把它加进 PATH。

🐧 Linux 发行版识别示例

go
distro, err := installer.DetectLinuxDistro()
if err != nil {
    log.Fatal(err)
}
fmt.Printf("发行版: %s (ID=%s)\n", distro.Name, distro.ID)
fmt.Printf("包管理器: %s\n", distro.PackageManager)

// 可顺带检查/安装 PHP
if installer.HasPHP() {
    ver, _ := installer.GetPHPVersion()
    fmt.Printf("PHP 已安装: %s\n", ver)
} else {
    _ = installer.InstallPHP(distro, false)
}

⚙️ 跨平台写代码的注意事项

路径分隔符

SDK 内部已用 filepath.Join 处理路径分隔符,你传路径时也请用 filepath.Join 而非硬编码 /

go
import "path/filepath"
dir := filepath.Join("data", "sub") // Windows 上自动变成 data\sub

工作目录权限

在 Windows 上往 C:\Program Files 之类受保护目录写文件需要管理员权限。建议把 WorkingDir 指向用户可写目录。

CI 容器

在 GitHub Actions / GitLab CI 的 Linux 容器里通常以 root 运行,安装器无需 sudo 即可全局安装。本地 macOS 开发机则建议走 brew,避免手动 sudo。

🧭 下一步

基于 MIT 许可证发布