Composer的bin属性如何让你的库提供全局可用的命令行工具? (脚本暴露)

9次阅读

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

Composer的bin属性如何让你的库提供全局可用的命令行工具? (脚本暴露)

什么是 bin 属性?

bincomposer.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 installcomposer 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

text=ZqhQzanResources