bin-dir必须是相对路径,如"bin"或"./tools",不能写绝对路径;目录需手动创建且有写权限,否则composer install报错;改配置后须清缓存并重装依赖才生效。

bin-dir 必须是相对路径,不能写绝对路径
Composer 2.2+ 虽然支持 $HOME 展开,但绝大多数项目场景下,bin-dir 只能填相对路径(如 "bin"、"scripts"、"./tools")。一旦写成 /home/user/myproject/bin 或 C:\myproject\bin,composer install 会直接报错:Invalid bin-dir path。
原因很简单:Composer 解析 bin-dir 时,始终以项目根目录为基准。它不关心你从哪启动命令,只认 composer.json 所在目录的相对位置。
- ✅ 正确写法:
"bin-dir": "bin"→ 实际路径是./bin - ✅ 正确写法:
"bin-dir": "./scripts"→ 实际路径是./scripts - ❌ 错误写法:
"bin-dir": "/full/path/to/bin"→ 触发校验失败 - ⚠️ 注意:
"bin-dir": "$HOME/bin"在全局配置中可能生效,但项目级不推荐,且行为不稳定
改完 composer.json 后,必须重装依赖才生效
只改 composer.json 不会移动已有脚本,也不会创建新目录——vendor/bin 里的旧链接照常存在,新 bin-dir 下仍是空的。
要真正切换过去,得强制重建所有 bin 文件:
- 删掉整个
vendor/目录(别只删vendor/bin) - 运行
composer clear-cache避免缓存干扰 - 再执行
composer install(或composer update)
此时 Composer 才会按新 bin-dir 创建目录(前提是该目录已存在且可写),并把所有包声明的 bin 脚本链接或复制进去。
目录必须手动创建,否则静默失败或报错
bin-dir 指向的目录不会被 Composer 自动创建。如果设了 "bin-dir": "bin" 却没提前 mkdir bin,composer install 会卡在最后一步,报错:Could not create bin dir。
更隐蔽的情况是:目录存在但无写权限(比如 CI 环境里用 root 创建了 bin/,但后续以普通用户运行 composer install),也会失败,且错误信息可能不明确。
- 务必在运行
composer install前,确认目标目录存在:ls -d bin/ - 检查写权限:
test -w bin/ && echo ok || echo no write - Windows 下若用非管理员身份运行,还可能因符号链接限制 fallback 到 wrapper 模式,此时需加
"bin-compat": "full"避免中断
PATH 不会自动更新,调用命令前得自己处理
改了 bin-dir 只影响脚本“放哪儿”,不影响 shell “去哪儿找”。默认情况下,bin/ 不在 $PATH 里,所以 phpunit 还是报 command not found。
常见做法有三种,选哪个取决于使用场景:
- 开发时临时生效:
export PATH="$(pwd)/bin:$PATH"(推荐放在项目根目录的.env或 alias 里) - 长期生效(仅当前用户):把
export PATH="./bin:$PATH"加进~/.zshrc,但注意./bin是相对路径,只在项目根目录下有效 - CI/CD 或部署时:直接用全路径调用,比如
./bin/phpunit,最稳妥,不依赖环境变量
IDE(如 PhpStorm)通常硬编码识别 vendor/bin,改了 bin-dir 后得手动在设置里指定新路径,否则代码补全和调试会失效。











