Composer 默认将二进制文件软链至 vendor/bin,改用 vendor-bin 需设 "bin-dir": "vendor-bin" 并启用 "bin-compat": "full" 以生成包装脚本而非软链,否则无法生效。
Composer 默认把所有包的二进制文件(如
、
、
)软链到项目根目录的
下,但这个路径容易和开发工具链冲突,也难以区分“谁提供的二进制”——想单独隔离,用
是可行的,但 Composer 原生不支持该目录名,需手动干预。
vendor-bin 不是 Composer 内置配置项
官方文档中没有
或类似字段;
是唯一控制二进制存放位置的配置,它只接受一个字符串路径值,且默认就是
。试图在
里写
会生效,但只是改了软链接目标,并不会让 Composer 自动把包里的
目录内容复制或重定向过去——关键点在于:它只影响软链位置,不改变安装逻辑。
所以真要实现“独立存放”,得配合两个动作:改
+ 禁用软链 + 手动处理 bin 文件。
设置
并禁用自动软链
在
的
段落中显式声明:
是重点:它让 Composer 在 Windows 下生成 .bat 包装器,在类 Unix 系统下生成 shell 包装脚本,而不是依赖符号链接。这样即使
是个干净空目录,也能正常生成可执行入口。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
注意:
(默认值)在非 Linux/
mac
OS 上可能失败,而
会彻底跳过二进制注册——除非你完全不用命令行工具,否则别选
。
安装后仍看不到 vendor-bin?检查这些地方
运行
或
后,确认
下是否生成了对应文件(如
);没生成?大概率是某个包没声明
字段,或你用了
必须对当前用户有写权限,否则 Composer 会静默跳过创建(无报错)
某些 IDE(如 PHPStorm)缓存了
路径,改完配置后需重启或刷新外部工具配置
如果你之前运行过
,先删掉旧的
和
,再重新 install,避免残留软链干扰
实际项目中更推荐的替代方案
纯靠
切换目录,治标不治本——它不能解决“多个包提供同名二进制”(如两个不同版本的
)或“按环境启用不同工具”的问题。更健壮的做法是:
用
(Composer 2.5+)管理多版本二进制:
,它会在
下隔离安装
把工具移到
目录,用
单独拉取,不混入
放弃本地
,改用
或
等专用二进制分发工具统一管理
真正需要
的场景其实很少,多数时候只是想避免污染
——但只要清楚
的作用边界和
的行为差异,就能避开最常踩的“目录建了但没文件”“命令找不到”“Windows 下执行失败”这三类坑。
phpunitphpcslarastanvendor/bin/vendor-binvendor-binconfig.bin-dirvendor/bincomposer.json"bin-dir": "vendor-bin"bin/bin-dirbin-dircomposer.jsonconfig
{
"config": {
"bin-dir": "vendor-bin",
"bin-compat": "full"
}
}
bin-compat: fullvendor-binbin-compat: symlinknonenonecomposer installcomposer updatevendor-bin/phpunitbin--no-scriptsvendor-bin/vendor/bincomposer installvendor/bin/vendor-bin/bin-dirphpstancomposer bincomposer bin phpstan install phpstan/phpstan:^1.10vendor-bin/phpstan/tools/composer create-projectvendor/vendor-binphiveghcupvendor-binvendor/binbin-dirbin-compat