Skip to content

🌡️ 环境

通过 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"
)

方法签名

方法签名说明
🌡️ SetEnvVariablefunc SetEnvVariable(name EnvironmentVariable, value string) error设置任意 COMPOSER_* 变量
📖 GetEnvVariablefunc GetEnvVariable(name EnvironmentVariable) string读取 COMPOSER_* 变量(无则空串)
⏱️ SetProcessTimeoutfunc SetProcessTimeout(seconds int) error设置进程超时秒数
🐙 EnableSuperuserfunc EnableSuperuser() error允许 root 运行
🚫 DisableSuperuserfunc DisableSuperuser() error禁止 root 运行
💾 SetMemoryLimitfunc SetMemoryLimit(limit string) error设置 PHP 内存限制
🤖 DisableInteractionfunc DisableInteraction() error禁用交互提示
💬 EnableInteractionfunc EnableInteraction() error启用交互提示
📦 SetVendorDirfunc SetVendorDir(path string) error重定向 vendor 目录
🗂️ SetBinDirfunc SetBinDir(path string) error重定向 bin 目录
🔒 SetCaFilefunc SetCaFile(path string) error指定 CA 证书文件
🚫 DisableDevfunc DisableDev() error不装开发依赖
✅ EnableDevfunc EnableDev() error恢复开发依赖
🗑️ SetDiscardChangesfunc SetDiscardChanges(value string) error控制修改处理(true/false/stash
🔍 GetComposerPathfunc GetComposerPath() (string, error)查找 composer / composer.phar 路径
📋 GetEnvironmentInfofunc (c *Composer) GetEnvironmentInfo() (map[string]string, error)composer config --list 解析为 map

参数说明

SetMemoryLimit

参数类型说明
limitstring内存限制,如 512M2G-1(无限制)

SetDiscardChanges

参数类型说明
valuestringtrue=直接丢弃修改、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。

基于 MIT 许可证发布