composer update 默认不清理 vendor/bin 中废弃脚本,需配置 "bin-dir": "vendor/bin" 和 "bin-compat": "symfony"(或 "auto")才能触发自动清理,仅靠 update 命令本身无法解决残留问题。

Composer update 后 bin 目录残留旧脚本的问题
默认情况下,composer update 不会自动删除 vendor/bin/ 中已废弃的可执行脚本——比如某个包被移除或降级后,它注册的二进制文件(如 phpunit、larastan)仍留在那里,可能造成命令冲突或误调用。
启用 bin-compat 并设置 bin-dir 为 vendor/bin
Composer 自 2.2 起支持 bin-compat 配置项,配合规范的 bin-dir 设置,才能触发自动清理逻辑。仅靠 composer update 默认行为是不够的。
-
"config": { "bin-dir": "vendor/bin", "bin-compat": "symfony" }是最低要求配置(symfony或auto均可,但不能省略) - 若项目根目录有
composer.json,直接编辑该文件;若使用全局配置,需确认COMPOSER_HOME/config.json中未覆盖此项 - 旧版 Composer(bin-compat,升级命令:
composer self-update --2
运行 composer update 时触发清理的条件
清理动作不是每次 update 都发生,只在满足以下全部条件时执行:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 当前
vendor/中存在bin/目录(即之前生成过脚本) -
composer.lock中记录的包依赖关系发生变化(例如某包被完全移除,或其bin字段消失) -
composer.json的config.bin-dir指向vendor/bin(非自定义路径) - 没有使用
--no-scripts或--ignore-platform-reqs等跳过钩子的选项
验证是否生效:删掉一个带 bin 的依赖(如 "phpunit/phpunit": "^9"),运行 composer update 后检查 vendor/bin/phpunit 是否真的被删除。
手动清理残留脚本的兜底方法
如果因配置未生效或版本兼容问题导致自动清理失败,不要手动删 vendor/bin/* —— 这会破坏后续 install 的一致性。正确做法是重置 bin 目录:
- 先清空:
rm -rf vendor/bin - 再重建:
composer dump-autoload --optimize(此命令会重新扫描所有包的bin字段并生成脚本) - 注意:
composer install本身不重建 bin,必须显式触发 autoload dump 或再次update
真正起作用的是 Composer 对 bin 字段的增量比对逻辑,不是某个开关按钮;配置写错、路径不匹配、或 lock 文件没更新,都会让这个机制静默失效。










