bin 属性是 composer.json 中声明可执行脚本路径的可选字段,Composer 会将其链接到 bin 目录以供全局或本地调用;需满足数组格式、文件有执行权限、含正确 shebang 三条件。

什么是 bin 属性?
bin 是 composer.json 中的一个可选字段,用于声明一个或多个可执行脚本文件的路径。当你的包被安装为全局依赖(composer global require vendor/package)或作为项目依赖并启用自动发现时,Composer 会把这里列出的文件软链接(或复制)到 Composer 的 bin 目录(如 ~/.composer/vendor/bin/ 或 vendor/bin/),使其能被系统直接调用。
如何正确配置 bin 并让命令生效?
必须满足三个条件,缺一不可:
-
bin字段值是字符串数组,每个元素是相对于包根目录的可执行文件路径(如"bin/mytool") - 该文件本身要有 Unix 执行权限(
chmod +x bin/mytool) - 文件开头必须有正确的 shebang 行(例如
#!/usr/bin/env php),否则在 Linux/macOS 下无法直接运行
示例 composer.json 片段:
{
"name": "acme/mytool",
"bin": ["bin/mytool"],
"autoload": {
"psr-4": { "Acme\\MyTool\\": "src/" }
}
}
对应 bin/mytool 文件内容:
#!/usr/bin/env php为什么
vendor/bin/下没生成符号链接?常见原因不是配置错,而是安装方式不对:
- 只运行
composer install或composer require—— 这只会把脚本链接到vendor/bin/,仅限当前项目使用 - 想全局可用,必须用
composer global require acme/mytool,且确保~/.composer/vendor/bin/(或 Windows 下对应路径)已加入$PATH - Windows 用户注意:
composer global生成的是.bat包装器,不是原生可执行文件;shebang 会被忽略,但 PHP 解释器仍需能被找到
常见陷阱与兼容性提醒
最容易被忽略的点集中在环境和权限上:
- Mac/Linux 下忘记
chmod +x,导致Permission denied错误 - shebang 写成
#!/usr/bin/php而非#!/usr/bin/env php,在不同系统或自定义 PHP 路径下失效 - 全局安装后命令不生效,大概率是
~/.composer/vendor/bin/没进$PATH;检查方式:echo $PATH | grep composer - 如果用了 Composer 2.2+ 的插件机制(如
bin-compat),某些旧版脚本可能被跳过——建议始终用标准bin字段,不依赖插件
真正起作用的从来不是“写了 bin”,而是“文件可执行 + 路径可达 + 解释器可用”。三者断一,命令就卡在 command not found。










