composer仅识别composer_home、composer_cache_dir等硬编码环境变量,其他变量需在composer.json中显式用${var}引用且仅config.http-basic、repositories[].url等字段支持插值。

Composer 不会自动加载 .env 文件,也不从 PHP 运行时环境“读取”你随便设的变量。它只在启动瞬间调用 getenv(),且仅对明确支持插值的配置字段生效。想覆盖默认行为,核心不是“怎么读”,而是“怎么让 getenv() 真的返回你要的值”。
哪些环境变量 Composer 实际会读?
Composer 只识别一组硬编码的环境变量名,其他一概无视:
-
COMPOSER_HOME:决定全局配置/缓存根目录,默认是~/.composer(Linux/macOS)或%APPDATA%\Composer(Windows) -
COMPOSER_CACHE_DIR:覆盖缓存路径,优先级高于COMPOSER_HOME -
COMPOSER_NO_INTERACTION:强制非交互模式,等价于加--no-interaction -
COMPOSER_NO_SCRIPTS:跳过所有post-install-cmd类脚本 -
COMPOSER_MEMORY_LIMIT:仅影响 Composer 自身内存限制(通过ini_set('memory_limit', ...)),不改变 PHP CLI 的-d memory_limit -
COMPOSER_VENDOR_DIR:唯一能临时改vendor/目录位置的方式,但只对当次命令生效
注意:COMPOSER_AUTH、GIT_USERNAME 这类变量本身不会触发任何行为,只有你在 composer.json 里显式写成 ${GIT_USERNAME} 并用在支持插值的字段中,才可能被展开。
为什么 export COMPOSER_AUTH=... 有时失效?
因为 COMPOSER_AUTH 不是 Composer 原生识别的变量——它只是你自定义的名称。它的作用完全依赖于你是否在 composer.json 的 config.http-basic 或类似字段中引用了它。常见失效场景:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在 CI/CD(如 GitHub Actions)里没用
env:块显式注入,只靠.env文件或本地export,变量根本进不到 PHP 进程 - 用
sudo composer install:大部分系统默认清空用户环境变量,getenv()返回false - Docker 容器里没用
--env或environment:传入,或者用了docker-compose run --rm却忘了带-e - 变量名拼错,比如写成
COMPOSER_AUTN,getenv()直接返回false,而 Composer 对未定义变量默认静默忽略,不报错
composer.json 里哪些字段真正支持 ${VAR} 插值?
不是所有字段都支持。只有一部分明确文档标注“supports variable interpolation”的字段才有效:
-
config.http-basic:例如{"gitlab.example.com": {"username": "${GIT_USER}", "password": "${GIT_TOKEN}"}} -
repositories[].url:比如私有 Packagist 地址写成"${PRIVATE_REPO_URL}" -
config.notify-batch、config.process-timeout等数值型配置,值必须是数字字符串(如"${TIMEOUT_SECONDS}",且变量内容得是"300") -
config.github-protocols和config.repos不支持插值,写了也白写
关键点:变量在运行时展开,不会写回 composer.json;如果变量未定义,对应字段会被跳过,而不是报错——这容易导致认证失败却无提示。
如何确保变量在所有上下文里都可用?
不能只靠本地 shell 的 export。不同环境需要不同注入方式:
- 本地开发:写进
~/.zshrc或~/.bash_profile,然后source,再验证echo $GIT_TOKEN - GitHub Actions:必须在 job step 里用
env:显式声明,不能只靠.env - Docker:用
docker run --env GIT_TOKEN=xxx或docker-compose.yml的environment:块,ENV指令只对构建阶段有效 - systemd 服务:在
[Service]段里加Environment=COMPOSER_NO_INTERACTION=1
最易被忽略的是:变量必须在 PHP 进程启动前就存在。放在 autoload.files 或 vendor/autoload.php 里加载 vlucas/phpdotenv 是无效的——Composer 解析 composer.json 时,这些代码根本还没执行。










