🌡️ 环境
通过 Composer 的环境变量(COMPOSER_*)调控行为:超时、内存、超级用户、交互、vendor/bin 目录、CA 证书、dev 依赖、修改丢弃等,并查询 Composer 的实际安装路径与环境配置清单。
这些都是进程级 os.Setenv 操作,影响后续所有 composer 子进程。除 GetComposerPath / GetEnvironmentInfo 外,其余函数都是包级函数(无需 *Composer 实例)。
何时使用
- 🐳 Docker / CI 容器里以 root 运行,需要
EnableSuperuser才能跑 Composer。 - ⏱️ 长任务(
composer update大型 monorepo)默认 300 秒超时不够,用SetProcessTimeout调大。 - 💾 大型依赖解析时 PHP 内存溢出,用
SetMemoryLimit放开到-1。 - 🤖 CI 必须非交互,用
DisableInteraction避免卡在提示。 - 🔒 内网走自签证书,用
SetCaFile指定信任的 CA bundle。 - 📦 把 vendor 目录重定向到容器卷,加快缓存复用。
结构化类型
EnvironmentVariable
environment.go 定义的预定义环境变量常量,是 SetEnvVariable / GetEnvVariable 的入参。
go
type EnvironmentVariable string
const (
EnvComposerHome EnvironmentVariable = "COMPOSER_HOME"
EnvComposerCacheDir EnvironmentVariable = "COMPOSER_CACHE_DIR"
EnvComposerProcessTimeout EnvironmentVariable = "COMPOSER_PROCESS_TIMEOUT"
EnvComposerAllowSuperuser EnvironmentVariable = "COMPOSER_ALLOW_SUPERUSER"
EnvComposerMemoryLimit EnvironmentVariable = "COMPOSER_MEMORY_LIMIT"
EnvComposerDisableXdebugWarn EnvironmentVariable = "COMPOSER_DISABLE_XDEBUG_WARN"
EnvComposerNoInteraction EnvironmentVariable = "COMPOSER_NO_INTERACTION"
EnvComposerVendorDir EnvironmentVariable = "COMPOSER_VENDOR_DIR"
EnvComposerBinDir EnvironmentVariable = "COMPOSER_BIN_DIR"
EnvComposerCafile EnvironmentVariable = "COMPOSER_CAFILE"
EnvComposerNoDev EnvironmentVariable = "COMPOSER_NO_DEV"
EnvComposerDiscardChanges EnvironmentVariable = "COMPOSER_DISCARD_CHANGES"
EnvComposerHtaccessProtect EnvironmentVariable = "COMPOSER_HTACCESS_PROTECT"
EnvComposerMirrorPathRepos EnvironmentVariable = "COMPOSER_MIRROR_PATH_REPOS"
)方法签名
| 方法 | 签名 | 说明 |
|---|---|---|
| 🌡️ SetEnvVariable | func SetEnvVariable(name EnvironmentVariable, value string) error | 设置任意 COMPOSER_* 变量 |
| 📖 GetEnvVariable | func GetEnvVariable(name EnvironmentVariable) string | 读取 COMPOSER_* 变量(无则空串) |
| ⏱️ SetProcessTimeout | func SetProcessTimeout(seconds int) error | 设置进程超时秒数 |
| 🐙 EnableSuperuser | func EnableSuperuser() error | 允许 root 运行 |
| 🚫 DisableSuperuser | func DisableSuperuser() error | 禁止 root 运行 |
| 💾 SetMemoryLimit | func SetMemoryLimit(limit string) error | 设置 PHP 内存限制 |
| 🤖 DisableInteraction | func DisableInteraction() error | 禁用交互提示 |
| 💬 EnableInteraction | func EnableInteraction() error | 启用交互提示 |
| 📦 SetVendorDir | func SetVendorDir(path string) error | 重定向 vendor 目录 |
| 🗂️ SetBinDir | func SetBinDir(path string) error | 重定向 bin 目录 |
| 🔒 SetCaFile | func SetCaFile(path string) error | 指定 CA 证书文件 |
| 🚫 DisableDev | func DisableDev() error | 不装开发依赖 |
| ✅ EnableDev | func EnableDev() error | 恢复开发依赖 |
| 🗑️ SetDiscardChanges | func SetDiscardChanges(value string) error | 控制修改处理(true/false/stash) |
| 🔍 GetComposerPath | func GetComposerPath() (string, error) | 查找 composer / composer.phar 路径 |
| 📋 GetEnvironmentInfo | func (c *Composer) GetEnvironmentInfo() (map[string]string, error) | composer config --list 解析为 map |
参数说明
SetMemoryLimit
| 参数 | 类型 | 说明 |
|---|---|---|
limit | string | 内存限制,如 512M、2G、-1(无限制) |
SetDiscardChanges
| 参数 | 类型 | 说明 |
|---|---|---|
value | string | true=直接丢弃修改、false=询问、stash=暂存 |
示例
CI 容器环境一次性配置
go
package main
import (
"fmt"
"log"
"github.com/scagogogo/composer-skills/pkg/composer"
)
func main() {
// CI 经典组合拳
_ = composer.EnableSuperuser() // 容器里以 root 运行
_ = composer.DisableInteraction() // 非交互
_ = composer.SetProcessTimeout(0) // 不超时(0 = 无限)
_ = composer.SetMemoryLimit("-1") // PHP 内存不限
_ = composer.DisableDev() // 不装 require-dev
comp, err := composer.New(composer.DefaultOptions())
if err != nil {
log.Fatal(err)
}
info, err := comp.GetEnvironmentInfo()
if err != nil {
log.Fatal(err)
}
fmt.Printf("home = %s\n", info["home"])
fmt.Printf("bin-dir = %s\n", info["bin-dir"])
}内网自签证书
go
if err := composer.SetCaFile("/etc/ssl/certs/internal-ca.pem"); err != nil {
log.Fatal(err)
}
// 之后 composer 才能拉取内网 https 仓库重定向 vendor 目录到缓存卷
go
_ = composer.SetVendorDir("/cache/vendor")
_ = composer.SetBinDir("/cache/vendor/bin")通用 SetEnvVariable / GetEnvVariable
go
// 设置缓存目录到高速 SSD
_ = composer.SetEnvVariable(composer.EnvComposerCacheDir, "/mnt/ssd/composer-cache")
// 读回确认
fmt.Println("cache-dir =", composer.GetEnvVariable(composer.EnvComposerCacheDir))查找 Composer 可执行文件
go
path, err := composer.GetComposerPath()
if err != nil {
log.Fatalf("未找到 composer: %v", err)
}
fmt.Println("composer 路径:", path)进阶
进程级副作用
所有 Set* 函数调用的是 os.Setenv,影响整个进程及其后派生的 composer 子进程,且无法回滚到调用前的值。Disable* / Enable* 成对出现就是为了让你能切换状态,但恢复的只是「默认值」而非「调用前的原始值」。
GetEnvironmentInfo 的解析
GetEnvironmentInfo 执行 composer config --list,按 : 分割每行为 key/value 写入 map。注意 Composer 不同版本输出分隔符可能是 或 :,本方法用 SplitN(line, ":", 2),对 key: value 形式有效。
GetComposerPath 的查找顺序
先 exec.LookPath("composer"),找不到再找 composer.phar。两者都没有则返回错误,此时应改用 安装器 自动安装 Composer。