bin-dir 是 Composer 控制可执行脚本存放路径的配置项,默认为 vendor/bin,可设为 bin 或 ./tools 等相对路径;需手动创建目录,且需将新路径加入 $PATH 或用 composer exec 才能运行命令。

bin-dir 是什么,为什么需要改它
bin-dir 是 Composer 的配置项,控制 vendor/bin/ 这个目录的位置——也就是运行 composer require 安装带命令行工具的包(比如 phpunit、larastan、phinx)后,生成的可执行脚本(symlink 或 wrapper)放哪儿。
默认是 vendor/bin,但你可能想把它挪到项目根目录下的 bin/,或统一放到 ./tools/ 便于 IDE 识别、Git 忽略,或避免某些 CI 环境对 vendor/ 下二进制文件的权限限制。
全局设置 vs 项目级设置:用哪个更安全
Composer 支持两种配置层级:global(影响所有项目)和 local(只影响当前项目)。除非你真有跨项目统一 bin 目录的需求,否则优先用项目级配置,避免污染其他项目。
修改方式如下:
- 项目级:在项目根目录的
composer.json中添加"config": { "bin-dir": "bin" } - 全局级:运行
composer config --global bin-dir bin(不推荐,易引发冲突) - 临时覆盖:运行
composer install --bin-dir=scripts(仅本次生效)
注意:bin-dir 值必须是相对路径(如 "bin"、"./tools"),不能写绝对路径;且该目录**不会被自动创建**,需手动 mkdir bin,否则后续 composer install 会报错 Could not create bin dir。
改完 bin-dir 后,命令还能直接运行吗
不能自动生效。因为 shell 只会在 $PATH 里找命令,而新 bin-dir(比如 bin/)默认不在 $PATH 中。
常见应对方式:
- 手动加到 PATH:在 shell 配置里追加
export PATH="./bin:$PATH"(仅当前终端或子进程有效) - 用
composer exec:比如composer exec phpunit,它会自动识别当前bin-dir并执行 - IDE 需要重新配置:PhpStorm 等工具读取的是
vendor/bin的硬编码路径,改了bin-dir后得在设置里手动指定新路径
另外,有些包(如 Laravel 的 artisan)本身不是通过 Composer 的 bin 机制注册的,它们不受 bin-dir 影响——别指望改了这个就能把 artisan 挪进 bin/。
Windows 下 symlink 失败?得关掉 bin-compat
Windows 默认不支持符号链接(尤其非管理员运行时),Composer 会 fallback 到生成 .bat + .php wrapper,但有时仍失败,报错类似 Failed to create symbolic link。
这时除了确保以管理员身份运行终端,更稳妥的做法是关闭 symlink 依赖:
- 在
composer.json的config里加"bin-compat": "full" - 或运行
composer config bin-compat full
"bin-compat": "full" 表示强制生成 .bat 和 .sh 包装器(而非 symlinks),兼容性更好,但会多出一堆小文件;"bin-compat": "symlink"(默认)在 Windows 上容易翻车。
改完记得删掉旧 vendor/bin(或新 bin/)再跑 composer install,否则残留的 symlink 可能干扰新逻辑。










