项目级config完全覆盖全局配置而非合并;例如全局设bin-dir为~/.local/bin,项目中设为bin,则全局值失效,vendor/bin脚本不生成。

项目级 config 会直接覆盖全局配置,不是合并
你改了 ~/.composer/config.json 里的 bin-dir,但 vendor/bin 还是没生成脚本?大概率是项目 composer.json 里写了 "bin-dir": "bin" —— 它不是“加一条”,而是把全局值整个扔掉。Composer 的 config 字段压根不支持嵌套合并,同名键就是硬替换。
常见错误现象:
-
composer dump-autoload后vendor/bin空空如也,但composer.json明明声明了"bin": ["foo"] - 全局设了
"process-timeout": 3600,项目里只写"notify-on-install": false,结果超时还是 300 秒 - 执行
composer config --list看到config.bin-dir是项目值,composer config --global --list却显示另一套 —— 说明已被覆盖
验证方式:进项目目录后分别运行 composer config --list 和 composer config --global --list,对比输出即可确认哪一层生效。
repositories 数组不继承、不合并,只用项目级定义
你在全局配了阿里云镜像:composer config -g repos.packagist.org https://mirrors.aliyun.com/composer/,但项目里只要出现 "repositories": [] 或任何非空数组,全局配置就彻底失效。Composer 不会把全局和项目级的 repositories 拼起来,它只认项目 composer.json 里写的那个数组。
实操要点:
- 全局配置只影响「未声明
repositories」的项目;一旦项目里有该字段,全局值即被丢弃 - 全局
repos.packagist.org是单值字段,多次composer config -g只会覆盖,不会追加多个镜像 - 想让私有源生效,必须把它放在项目
repositories数组最前面,并确保{"packagist.org": false}是独立项、在数组末尾 - 删掉
vendor/和composer.lock再运行composer install,否则旧 lock 文件里的源哈希可能仍指向原站
bin-dir 路径校验失败会静默回退,不报错
bin-dir 不是随便写的路径。如果设为相对路径(如 "bin"),而 vendor-dir 也是相对路径(如 "vendor"),Composer 会检查二者是否构成合法父子关系;若不满足,就直接放弃你的设置,退回到默认的 vendor/bin —— 整个过程不提示、不报错。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
容易踩的坑:
-
"vendor-dir": "vendor"+"bin-dir": "/usr/local/bin"→ 静默忽略bin-dir,用回vendor/bin -
"vendor-dir": "libs/vendor"+"bin-dir": "bin"→ 若bin不在libs/vendor下,同样失效 - 绝对路径必须真实可写,且 Composer 不校验权限,只做路径结构判断
解决办法:要么用绝对路径(如 /opt/myproject/bin),要么确保 bin-dir 是 vendor-dir 的子目录(如 "vendor-dir": "vendor", "bin-dir": "vendor/bin")。
修改 config 后不生效?缓存和 auth.json 分离常被忽略
改完 composer.json 的 config 段,composer install 却没反应?先清缓存:composer clear-cache。Composer 会缓存解析后的配置,尤其在 CI 或 Docker 环境中,旧缓存可能持续数小时。
另一个隐形干扰项是 auth.json:它和 config 是两套机制,但都影响源访问。比如你配了私有 GitLab 源,却把 token 写进了 composer.json 的 config 里 —— 这不仅危险(代码泄露),而且无效。Composer 只从 auth.json(项目根目录或全局)读认证凭据,config 里写的任何 auth 相关字段都会被忽略。
关键点:
-
auth.json必须和composer.json同级,不能放错位置;全局auth.json在~/.composer/auth.json(Linux/macOS)或%APPDATA%\Composer\auth.json(Windows) - 敏感信息严禁出现在
composer.json中,CI 场景应通过环境变量注入COMPOSER_AUTH -
COMPOSER环境变量可临时指定配置文件路径,但会跳过 autoload、scripts 等 —— 仅适合调试config本身

















