在 composer.json 的 config 段中配置 "bin-dir": "bin" 即可将工具安装到项目根目录下的 bin/ 目录,修改后需运行 composer install 或 update 生效;该配置为项目级,不继承全局设置,且仅对声明了 "bin" 字段的依赖生效。

composer.json 里怎么配 bin-dir
直接在项目根目录的 composer.json 中加 "config" 段,指定 bin-dir 路径即可。路径支持相对(推荐)和绝对两种写法,但相对路径会基于项目根目录解析。
-
"bin-dir": "bin"→ 工具安装到项目下的bin/目录(最常用) -
"bin-dir": "vendor/bin"→ 和默认行为一致,可显式声明 -
"bin-dir": "/usr/local/bin"→ 绝对路径,需有写权限,不推荐用于多项目环境
改完记得运行 composer install 或 composer update,否则不会生效。
全局配置 bin-dir 会影响所有项目吗
不会。Composer 的 bin-dir 是项目级配置,优先读取 composer.json 中的 config.bin-dir;只有项目中没定义时,才 fallback 到全局配置(即 composer config --global bin-dir 设置的值)。
- 全局设置命令:
composer config --global bin-dir /usr/local/bin - 但该设置仅对「没有声明
bin-dir」的新项目起作用 - 已有项目的
composer.json一旦写了bin-dir,全局配置就完全被忽略
为什么执行 composer install 后命令没出现在 bin-dir 里
常见原因不是配置错,而是包本身没声明 bin 字段。Composer 只会把 composer.json 中明确写了 "bin": ["xxx"] 的包,软链接或复制到 bin-dir 目录下。
- 检查依赖包的
composer.json是否含bin键,比如"bin": ["phpunit", "laravel"] - 运行
composer show vendor/package-name查看其bin声明 - 如果包没写
bin,哪怕装进vendor/,也不会出现在bin-dir - 部分工具(如
php-cs-fixer)从 v3 开始改用bin字段,旧版本可能用脚本方式分发,注意版本差异
bin-dir 路径不在 $PATH 里怎么办
Composer 不负责修改系统 $PATH,它只负责把可执行文件放进去。能否直接敲命令,取决于你的 shell 是否能搜到那个目录。
- 临时加:
export PATH="./bin:$PATH"(当前终端有效) - 永久加:在
~/.bashrc或~/.zshrc末尾加export PATH="./bin:$PATH",然后source ~/.zshrc - 项目级更安全的做法是用
composer exec,比如composer exec phpunit,自动识别bin-dir下的命令
相对路径(如 "bin-dir": "bin")配合 ./bin 加入 $PATH 最灵活,但要注意不同项目可能有冲突 —— 这点容易被忽略,尤其当多个项目都把 bin 加进全局 PATH 时。










