🖥️ 跨平台支持
Composer Skills 在 Windows、macOS、Linux 三大平台上一致工作。本页给出支持矩阵,并解释"智能默认"如何按平台选择安装方式。
📊 平台支持矩阵
| 平台 | 检测 Composer | 自动安装 Composer | 自动安装 PHP | 智能默认策略 |
|---|---|---|---|---|
| 🐧 Linux | ✅ | ✅ | ✅ | 包管理器(apt/dnf/pacman)优先,否则下载 phar |
| 🍎 macOS | ✅ | ✅ | ✅ | brew 优先,否则下载 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。
🔍 平台检测
检测器针对不同平台扫描不同路径:
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 环境变量手动指定路径:
// 用户可设:COMPOSER=/opt/composer/composer.phar
// 检测器会优先识别这个环境变量📦 智能默认:按平台选安装方式
安装器(pkg/installer)的 SmartConfig() 会按平台挑最合适的策略:
🐧 Linux
DetectLinuxDistro() 解析 /etc/os-release(兜底用 lsb_release 和已知文件),识别发行版后决定包管理器:
| 发行版 ID | 包管理器 | 安装命令 |
|---|---|---|
| ubuntu / debian | apt | apt-get install composer |
| fedora / rhel / centos | dnf/yum | dnf install composer |
| alpine | apk | apk add composer |
| arch | pacman | pacman -S composer |
包管理器没有的话,兜底下载 composer.phar 并写一个包装脚本到 /usr/local/bin/composer。
🍎 macOS
优先 brew install composer;没有 brew 时下载 phar。
🪟 Windows
下载 composer.phar 到固定目录,再生成一个 .cmd 包装脚本,把它加进 PATH。
🐧 Linux 发行版识别示例
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 而非硬编码 /:
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。
🧭 下一步
- 📡 Detector 文档 —— 各平台扫描路径与优先级。
- 📥 Installer 文档 —— 平台策略、发行版识别、PHP 安装。
- 🔧 自动安装机制 —— 检测→安装→验证全流程。
- 🔄 CI/CD 流水线 —— 在三大平台的 CI runner 上使用。