🌍 全局操作
Composer SDK 的全局操作模块封装 composer global 子命令的全部能力——在 Composer 全局目录(~/.composer)中安装、更新、移除、列举、执行依赖,以及生成全局自动加载、初始化全局项目、查看状态。所有方法都挂在核心类型 Composer 上。
主方法定义在 pkg/composer/global.go;WithOptions 变体与批量变体(GlobalInit、GlobalRequireMultiple、GlobalRemoveMultiple)定义在 pkg/composer/global.go 与 pkg/composer/additional_methods.go。
包路径:github.com/scagogogo/composer-skills/pkg/composer
能力一览 🌍
| 方法 | 作用 | 返回值 |
|---|---|---|
GlobalRequire | 全局安装单个包 | error |
GlobalRequireWithOptions | 带选项全局安装单个包 | error |
GlobalRequireMultiple | 一次性全局安装多个包 | error |
GlobalUpdate | 全局更新包 | error |
GlobalUpdateWithOptions | 带选项全局更新包 | error |
GlobalRemove | 全局移除单个包 | error |
GlobalRemoveWithOptions | 带选项全局移除单个包 | error |
GlobalRemoveMultiple | 一次性全局移除多个包 | error |
GlobalInstall | 全局安装依赖 | error |
GlobalList | 列出全局安装的包 | (string, error) |
GlobalHome | 获取全局目录路径 | (string, error) |
GlobalExecute | 执行全局安装的二进制 | (string, error) |
GlobalStatus | 显示全局安装包状态 | (string, error) |
GlobalDumpAutoload | 为全局安装生成自动加载 | error |
GlobalInit | 在全局目录初始化项目 | error |
全局目录
所有 global 子命令都在 ~/.composer(由 COMPOSER_HOME 决定)下工作。可用 配置模块 的 GetComposerHome 获取实际路径。
🌍 GlobalRequire
全局安装包,等价于 composer global require package[:version]。
何时使用
需要安装全局可用的 CLI 工具(如 phpunit/phpunit、friendsofphp/php-cs-fixer、laravel/installer)时使用。
签名
func (c *Composer) GlobalRequire(packageName string, version string) error参数
| 参数 | 类型 | 说明 |
|---|---|---|
packageName | string | 包名,例如 symfony/console |
version | string | 版本约束,例如 ^5.0;空字符串表示最新版本 |
返回值
error:全局安装过程中发生的错误。
示例
package main
import (
"log"
"github.com/scagogogo/composer-skills/pkg/composer"
)
func main() {
comp, err := composer.New(composer.DefaultOptions())
if err != nil {
log.Fatalf("初始化 Composer 失败: %v", err)
}
// 全局安装最新版的 Laravel 安装器
if err := comp.GlobalRequire("laravel/installer", ""); err != nil {
log.Fatalf("全局安装失败: %v", err)
}
// 全局安装指定版本
if err := comp.GlobalRequire("symfony/console", "^6.0"); err != nil {
log.Fatalf("全局安装失败: %v", err)
}
}进阶
需要 --prefer-dist、--no-progress、--no-suggest 等额外参数时使用 GlobalRequireWithOptions;一次安装多个包时使用 GlobalRequireMultiple。
🌍 GlobalRequireWithOptions
带自定义选项全局安装包,等价于 composer global require [options] package[:version]。
何时使用
需要控制安装方式(优先 dist/source、禁用进度条、跳过建议等)时使用。
签名
func (c *Composer) GlobalRequireWithOptions(packageName string, version string, options map[string]string) error参数
| 参数 | 类型 | 说明 |
|---|---|---|
packageName | string | 要全局安装的包名 |
version | string | 版本约束,空字符串表示最新版本 |
options | map[string]string | 额外选项,键为选项名,值为选项值 |
选项构造规则
options 经内部 buildOptionsArgs 处理:键按字典序排序后,值为空则生成 --key,否则生成 --key=value,保证命令构造确定性。
返回值
error:全局安装过程中发生的错误。
示例
options := map[string]string{
"prefer-dist": "",
"no-progress": "",
"no-suggest": "",
}
if err := comp.GlobalRequireWithOptions("symfony/console", "^5.0", options); err != nil {
log.Fatalf("全局安装包失败: %v", err)
}🌍 GlobalRequireMultiple
一次性全局安装多个包,等价于 composer global require pkg1[:v1] pkg2[:v2] ...。
何时使用
需要批量安装一组全局工具时使用——比循环调用 GlobalRequire 更高效(只触发一次解析与写入)。
签名
func (c *Composer) GlobalRequireMultiple(packages map[string]string) error参数
| 参数 | 类型 | 说明 |
|---|---|---|
packages | map[string]string | 包名到版本约束的映射;值为空字符串表示最新版本 |
返回值
error:全局安装过程中发生的错误。
示例
packages := map[string]string{
"laravel/installer": "", // 最新版本
"friendsofphp/php-cs-fixer": "^3.0",
"phpunit/phpunit": "^10.0",
}
if err := comp.GlobalRequireMultiple(packages); err != nil {
log.Fatalf("批量全局安装失败: %v", err)
}遍历顺序
map 遍历顺序在 Go 中不确定,因此最终命令行参数顺序也不确定。Composer 对参数顺序不敏感,结果一致;若需确定性输出(如审计日志),请改用 GlobalRequireWithOptions 逐个安装。
🌍 GlobalUpdate
全局更新包,等价于 composer global update [packages...]。
何时使用
需要更新全局工具到符合约束的新版本时使用。传入空切片则更新全部全局包。
签名
func (c *Composer) GlobalUpdate(packages []string) error参数
| 参数 | 类型 | 说明 |
|---|---|---|
packages | []string | 要更新的包名列表,为空则更新所有包 |
返回值
error:全局更新过程中发生的错误。
示例
// 更新指定的全局包
if err := comp.GlobalUpdate([]string{"symfony/console"}); err != nil {
log.Fatalf("全局更新失败: %v", err)
}
// 更新所有全局包
if err := comp.GlobalUpdate(nil); err != nil {
log.Fatalf("全局更新失败: %v", err)
}进阶
需要 --prefer-dist、--no-dev、--no-progress 等选项时使用 GlobalUpdateWithOptions。
🌍 GlobalUpdateWithOptions
带自定义选项全局更新包,等价于 composer global update [options] [packages...]。
何时使用
需要在 CI 中静默更新、或控制是否包含开发依赖时使用。
签名
func (c *Composer) GlobalUpdateWithOptions(packages []string, options map[string]string) error参数
| 参数 | 类型 | 说明 |
|---|---|---|
packages | []string | 要更新的包名列表,为空则更新所有包 |
options | map[string]string | 额外选项 |
返回值
error:全局更新过程中发生的错误。
示例
options := map[string]string{
"prefer-dist": "",
"no-dev": "",
"no-progress": "",
}
if err := comp.GlobalUpdateWithOptions([]string{"symfony/console"}, options); err != nil {
log.Fatalf("全局更新包失败: %v", err)
}🌍 GlobalRemove
全局移除包,等价于 composer global remove package。
何时使用
不再需要某个全局工具、或要清理冲突的全局包时使用。
签名
func (c *Composer) GlobalRemove(packageName string) error参数
| 参数 | 类型 | 说明 |
|---|---|---|
packageName | string | 要全局移除的包名 |
返回值
error:全局移除过程中发生的错误。
示例
if err := comp.GlobalRemove("symfony/console"); err != nil {
log.Fatalf("全局移除失败: %v", err)
}进阶
需要 --no-progress、--no-update 等选项时使用 GlobalRemoveWithOptions;一次移除多个包时使用 GlobalRemoveMultiple。
🌍 GlobalRemoveWithOptions
带自定义选项全局移除包,等价于 composer global remove [options] package。
何时使用
需要禁用进度条、或移除时不立即触发依赖更新时使用。
签名
func (c *Composer) GlobalRemoveWithOptions(packageName string, options map[string]string) error参数
| 参数 | 类型 | 说明 |
|---|---|---|
packageName | string | 要全局移除的包名 |
options | map[string]string | 额外选项 |
返回值
error:全局移除过程中发生的错误。
示例
options := map[string]string{
"no-progress": "",
"no-update": "",
}
if err := comp.GlobalRemoveWithOptions("symfony/console", options); err != nil {
log.Fatalf("全局移除包失败: %v", err)
}🌍 GlobalRemoveMultiple
一次性全局移除多个包,等价于 composer global remove pkg1 pkg2 ...。
何时使用
需要批量清理一组不再使用的全局工具时使用——比循环调用 GlobalRemove 更高效。
签名
func (c *Composer) GlobalRemoveMultiple(packages []string) error参数
| 参数 | 类型 | 说明 |
|---|---|---|
packages | []string | 要全局移除的包名列表 |
返回值
error:全局移除过程中发生的错误。
示例
packages := []string{
"laravel/installer",
"friendsofphp/php-cs-fixer",
"phpunit/phpunit",
}
if err := comp.GlobalRemoveMultiple(packages); err != nil {
log.Fatalf("批量全局移除失败: %v", err)
}🌍 GlobalInstall
全局安装依赖,等价于 composer global install。
何时使用
全局 composer.json 已存在、需要按 composer.lock 安装依赖时使用——常用于在新机器上恢复全局工具集。
签名
func (c *Composer) GlobalInstall() error返回值
error:全局安装过程中发生的错误。
示例
if err := comp.GlobalInstall(); err != nil {
log.Fatalf("全局安装失败: %v", err)
}Install vs Require
GlobalInstall 按 composer.lock 安装(不修改依赖清单);GlobalRequire 会向 composer.json 追加依赖并解析版本。
🌍 GlobalList
列出全局安装的包,等价于 composer global show。
何时使用
需要查看当前全局装了哪些工具及版本时使用。
签名
func (c *Composer) GlobalList() (string, error)返回值
string:全局安装包列表的原始输出。error:列出失败时返回的错误。
示例
output, err := comp.GlobalList()
if err != nil {
log.Fatalf("列出全局包失败: %v", err)
}
fmt.Println("全局已安装的包:")
fmt.Println(output)命令映射
此方法实际执行 composer global show(Composer 用 show 列出包,没有独立的 global list 子命令)。
🌍 GlobalHome
获取全局目录路径,等价于 composer global home。
何时使用
需要定位全局 vendor/bin、全局 composer.json 或全局 auth.json 时使用。
签名
func (c *Composer) GlobalHome() (string, error)返回值
string:全局目录路径。error:获取失败时返回的错误。
示例
home, err := comp.GlobalHome()
if err != nil {
log.Fatalf("获取全局目录失败: %v", err)
}
fmt.Printf("Composer 全局目录: %s\n", home)更可靠的替代
配置模块 的 GetComposerHome 通过 composer config --global home 获取,语义更清晰,推荐优先使用。
🌍 GlobalExecute
执行全局安装的包中的二进制文件,等价于 composer global exec command [args...]。
何时使用
需要在程序里调用某个全局安装的 CLI 工具(如 php-cs-fixer、laravel)时使用。
签名
func (c *Composer) GlobalExecute(command string, args ...string) (string, error)参数
| 参数 | 类型 | 说明 |
|---|---|---|
command | string | 要执行的二进制名称 |
args | ...string | 透传给二进制的参数 |
返回值
string:命令执行的输出结果。error:执行过程中发生的错误。
示例
// 调用全局安装的 php-cs-fixer
output, err := comp.GlobalExecute("php-cs-fixer", "fix", "src/", "--dry-run")
if err != nil {
log.Fatalf("执行失败: %v", err)
}
fmt.Println(output)与 Exec 模块的区别
脚本执行模块 的 Exec 执行的是项目 vendor/bin 下的二进制;GlobalExecute 执行的是全局 vendor/bin 下的二进制。
🌍 GlobalStatus
显示全局安装的包的状态,等价于 composer global status。
何时使用
需要查看全局包是否有未提交的本地修改、是否落后于远程时使用。
签名
func (c *Composer) GlobalStatus() (string, error)返回值
string:状态信息的原始输出。error:获取失败时返回的错误。
示例
status, err := comp.GlobalStatus()
if err != nil {
log.Fatalf("获取全局状态失败: %v", err)
}
fmt.Println("全局包状态:")
fmt.Println(status)🌍 GlobalDumpAutoload
为全局安装生成自动加载文件,等价于 composer global dump-autoload [--optimize]。
何时使用
手动改动了全局包的源码、或想优化全局工具启动性能时使用。
签名
func (c *Composer) GlobalDumpAutoload(optimize bool) error参数
| 参数 | 类型 | 说明 |
|---|---|---|
optimize | bool | true 启用 --optimize 优化自动加载(生产推荐) |
返回值
error:生成自动加载过程中发生的错误。
示例
// 生成优化的自动加载
if err := comp.GlobalDumpAutoload(true); err != nil {
log.Fatalf("生成全局自动加载失败: %v", err)
}🌍 GlobalInit
在全局目录初始化一个项目,等价于 composer global init --name=<name> --no-interaction。
何时使用
需要从零创建全局 composer.json(例如初始化一套全局工具清单)时使用。
签名
func (c *Composer) GlobalInit(name string) error参数
| 参数 | 类型 | 说明 |
|---|---|---|
name | string | 项目名称,格式 vendor/name |
返回值
error:初始化过程中发生的错误。
示例
if err := comp.GlobalInit("myvendor/global-tools"); err != nil {
log.Fatalf("全局初始化失败: %v", err)
}非交互式
此方法固定附带 --no-interaction,适合在 CI、容器等无 TTY 环境中使用。若全局 composer.json 已存在,init 可能会拒绝覆盖。