vendor-bin 不是 Composer 原生支持的目录,而是社区为隔离命令行工具(如 PHPStan、PHP-CS-Fixer)约定的目录结构;推荐使用 bamarni/composer-bin-plugin 自动管理软链接,避免路径冲突与维护问题。

vendor-bin 目录不是 Composer 原生概念
Composer 本身没有 vendor-bin 这个内置配置项或命令参数。你看到的 vendor-bin 通常来自第三方插件(比如 bin-compat 或 composer-bin-plugin),或是项目自定义的软链接/脚本约定。直接运行 composer install --vendor-bin=xxx 会报错:Unrecognized option "--vendor-bin"。
用 composer-bin-plugin 实现 vendor-bin 分离
这是目前最主流、也最接近“官方感”的方案,它把可执行工具(如 phpunit、phpcs)从 vendor/bin 移到独立目录,避免污染主 bin 下的全局入口。
操作步骤如下:
- 在项目根目录运行:
composer require --dev bamarni/composer-bin-plugin - 在
composer.json的extra段中添加配置:"extra": { "bin-dir": "vendor-bin" } - 执行
composer install或composer update,插件会自动把所有包的 bin 文件复制/链接到vendor-bin/,而原vendor/bin/保持为空或仅保留核心入口
注意:该插件只影响 bin 文件的安装位置,不影响 vendor/ 库本身的路径;且必须在 require-dev 中安装,否则生产环境不会加载它。
手动软链接或重定向 bin 目录(不推荐但可行)
如果你只是想让 vendor/bin 指向别的地方(比如统一管理到项目根下的 bin),可以绕过插件,靠脚本或符号链接实现:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 安装完依赖后,删掉默认
vendor/bin:rm -rf vendor/bin - 创建指向目标目录的软链:
ln -s ../bin vendor/bin(假设你要用项目根下的bin/) - 后续每次
composer install都会重新生成vendor/bin,所以这个链接会被覆盖——得配合post-install-cmd脚本自动重建
示例脚本(写入 composer.json 的 scripts):
"scripts": {
"post-install-cmd": [
"rm -rf vendor/bin",
"ln -s ../bin vendor/bin"
]
}
风险点:某些 IDE 或 CI 工具可能硬编码读取 vendor/bin,软链失效会导致找不到命令;且不同操作系统对符号链接支持不一(Windows 需管理员权限或启用开发者模式)。
为什么不要改 vendor 目录本身?
有人误以为 --vendor-dir=xxx 能顺便解决 bin 位置问题,但其实:--vendor-dir 只控制库文件存放路径(如 vendor/),所有 bin 文件仍默认生成在 {vendor-dir}/bin。即使你设成 --vendor-dir=libs,bin 还是落在 libs/bin,不是你想要的 vendor-bin。
真正要分离 bin 和库,必须靠插件或后期处理——因为 Composer 的设计里,“bin” 是依附于 vendor 目录结构的副产品,不是独立可配置维度。
实际项目里最容易被忽略的是插件加载时机:如果 composer-bin-plugin 装在 require-dev,而你在 CI 中用了 --no-dev,那它根本不会运行,vendor-bin 就不会被填充。这点在部署阶段特别容易出问题。

















