composer仅少数字段支持${var}变量插值,如config.http-basic、repositories[].url、config.process-timeout;必须提前注入系统环境变量,auth.json是唯一支持该语法的特殊文件,.env和autoload不参与解析。

Composer 本身不支持运行时动态修改配置值,所谓“环境变量覆盖”仅限少数字段在安装/更新阶段被 getenv() 解析一次,且必须提前注入系统环境,不是真正的动态切换。
哪些 config 字段真正支持 ${VAR} 变量插值
只有明确文档标注支持插值的字段才生效,常见可用项包括:
-
config.http-basic:用于私仓认证,如{"example.com": {"username": "${GIT_USER}", "password": "${GIT_TOKEN}"}} -
repositories[].url:私有 Packagist 地址,可写成"${PRIVATE_REPO_URL}" -
config.process-timeout、config.notify-batch等数值型配置(值需为数字字符串)
错误高发区:config.repos、config.github-protocols、autoload、scripts 全都不支持。写进去的 ${FOO} 会被当字面量存进 composer.json 或 composer.lock,不会替换,也不报错。
环境变量必须在 Composer 启动前就存在
Composer 运行时调用 getenv(),只读取当前 PHP 进程启动那一刻的环境变量。它不加载 .env 文件,也不解析 vendor/autoload.php 中的逻辑。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 本地开发:在 shell 配置中
export GIT_TOKEN=xxx,并确保source ~/.zshrc(或对应文件)已执行 - CI/CD(如 GitHub Actions):必须显式用
env:块注入,.env文件不会自动加载 - Docker:用
docker run -e GIT_TOKEN=xxx或docker-compose.yml的environment:字段传入 - 不能依赖
autoload.files加载 dotenv —— 此时 Composer 已完成自身初始化,变量插值早已结束
auth.json 是唯一支持 ${VAR} 的特殊文件
从 Composer 2.2 起,auth.json 支持有限的环境变量展开,仅限该文件,且只在 install/update 阶段生效。
- 格式必须是标准 JSON,但值中可写
"${GITHUB_TOKEN}" - 变量未定义时,Composer 默认跳过该字段,不报错,容易静默失败
- 不要把密码塞进
repositories[].url,例如"https://${U}:${P}@git.example.com"——${P}就是字符串,不会解析,且明文泄露风险极高 - 正确做法是用
auth.json或 Git 凭据助手,让 Composer 自动注入认证信息
别混淆 COMPOSER_HOME 和 composer config --global
COMPOSER_HOME 是路径开关,不是配置项;composer config --global 才是改全局行为的唯一安全方式。
-
COMPOSER_HOME必须设为绝对路径,不能含~或$HOME,设完要新开终端验证 -
composer config --global repos.packagist.org.url是设置镜像源的正确写法,拼错键名(如漏掉.org)会静默失效 -
minimum-stability这类字段虽能--global写入,但项目级composer.json存在时立即被覆盖,不是真全局 - 手动编辑
~/.config/composer/config.json极易出错,composer config --global --list --verbose才能看到真实生效路径
真正难处理的不是语法,而是变量注入时机和作用域边界——一旦漏掉 export、写错 env: 块位置、或误以为 .env 文件能影响 Composer 自身行为,就会陷入“变量明明设了却不生效”的调试循环。










