composer配置不支持局部叠加,项目composer.json的config字段会整块替换全局同名配置;仅github-oauth、http-basic等认证类配置支持多源叠加,其余均完全覆盖。

composer.json 里的 config 字段不支持“局部叠加”,只做整块替换
项目根目录下的 composer.json 中的 "config" 段,一旦出现任何同名键(比如 bin-dir、cache-dir、process-timeout),就会彻底屏蔽全局配置中对应项——不是“补充”,也不是“优先级更低被忽略”,而是直接丢弃全局值。你改了 composer config --global cache-dir /tmp/composer-cache,但项目里写了 "cache-dir": "vendor/cache",那最终就用 vendor/cache,全局设置形同虚设。
常见误操作包括:
- 在项目
composer.json里只写了一两个 config 键,以为其他键还能继承全局值 → 实际上全部失效 - 想靠
composer.json+auth.json分离敏感配置来“局部生效” →auth.json是独立读取的,但config不是 - 把
repositories写进项目 config,结果发现 packagist 官方源没了 → 因为整个repositories数组被替换成你写的那个,不是合并
真正能“环境差异化”的只有三类机制:环境变量、COMPOSER_AUTH、自定义脚本合并
Composer 原生不支持多环境配置文件(如 composer.prod.json),但可通过以下方式实现动态覆盖:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
COMPOSER_AUTH环境变量可完全替代磁盘上的auth.json,接受 JSON 字符串,适合 CI 注入私仓凭据:export COMPOSER_AUTH='{"http-basic":{"repo.example.com":{"username":"$USER","password":"$TOKEN"}}}' -
composer.json中支持${VAR_NAME}占位符,但仅限字符串字段;process-timeout、fxp-asset.repo类地址可用,而布尔或数字字段(如"notify-on-install": "${CI}")会解析失败 - 必须由 shell 层展开默认值(如
${COMPOSER_TIMEOUT:-300}),Composer 自身不处理 fallback;若未设该变量,命令直接报错,不会退到默认值 - 复杂场景建议用外部脚本合并:PHP/Shell 读取
common.json和prod.json,用array_merge_recursive合并后写入临时composer.json,再执行composer install
COMPOSER_HOME 和 PATH 配合错误,会导致“配置看似生效,命令却找不到”
很多人调通了 composer config --global github-oauth.github.com xxx,也能 composer global require topthink/think-cli 成功,但敲 think 就报“不是内部或外部命令”。这不是配置问题,是路径没对齐:
-
COMPOSER_HOME必须是绝对路径,不能含~、$HOME或%APPDATA%;Windows 下设成%APPDATA%\Composer是无效的,得写全路径C:\Users\Name\AppData\Roaming\Composer -
PATH要加的是$COMPOSER_HOME/vendor/bin(Linux/macOS)或%COMPOSER_HOME%\vendor\bin(Windows),不是composer.phar所在目录,也不是ComposerSetup\bin - 设完
COMPOSER_HOME或PATH后,必须新开终端验证;source ~/.zshrc或setx不足以让已运行的 shell 生效 - 验证命令:
composer config --list --global看路径是否匹配,echo $PATH或where think看命令是否可定位
认证类配置(github-oauth、http-basic)是唯一支持“叠加”的例外
几乎所有 config 字段都遵循“项目覆盖全局”规则,唯独认证类配置设计为多源共存:
- 全局
composer config --global github-oauth.github.com token1+ 项目composer.json里写"github-oauth": {"github.com": "token2"}→ 两者都会生效,Composer 会按需选择 -
http-basic同理:全局配了私仓 A,项目额外加了私仓 B,B 不会删掉 A - 但注意:如果项目
composer.json里写了"http-basic": {"repo.a.com": "xxx"},而全局也配了同一域名,则项目值会覆盖全局值(非追加);只有不同域名才叠加 - 这个叠加行为只适用于认证字段,
repositories、config、scripts全都不适用
${VAR} 只能在字符串字段里用,COMPOSER_AUTH 只管认证,而 github-oauth 的叠加能力只限于域名维度。真要支撑多套完整配置(比如 dev/staging/prod 各有不同 cache-dir、repositories、platform),必须靠外部脚本生成最终 composer.json,别指望 Composer 自己合并。










