bin字段仅声明包内真实可执行脚本路径(如"bin": ["bin/mytool"]),不自动创建文件或校验合法性;脚本须存在、chmod +x(unix)、首行#!/usr/bin/env php,且路径精确匹配、不支持glob或./前缀。

bin字段本身不“暴露”命令,它只告诉Composer:“把这些文件软链接到vendor/bin/”,是否能真正执行,取决于脚本是否存在、是否有x权限、有没有正确的shebang。
bin字段怎么写才生效
必须写在包自身的composer.json根对象里,值是字符串数组,每个元素是相对于包根目录的**真实可执行文件路径**:
-
"bin": ["bin/mytool"]✅ 正确:路径精确、无前缀、无通配符 -
"bin": ["./bin/mytool"]❌ 会被忽略(Composer不认./) -
"bin": ["scripts/*"]❌ 不支持glob,也不会展开匹配 -
"bin": ["bin/mytool.php"]❌ 文件名必须完全一致,Composer不自动补.php
脚本文件本身要满足三个硬性条件
哪怕composer install成功,vendor/bin/mytool仍可能报Permission denied或command not found——问题一定出在这三处:
- 文件必须存在且路径与
bin字段完全一致(比如bin/mytool不能是bin/mytool.php) - Linux/macOS下必须有执行权限:
chmod +x bin/mytool - 第一行必须是
#!/usr/bin/env php(不能写死#!/usr/bin/php,也不能缺)
Windows用户注意:vendor/bin/里的.bat包装器会绕过shebang,但前提是系统PATH里有php命令;否则直接报'php' is not recognized。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
为什么本地能跑,CI里vendor/bin/mytool却找不到
常见原因不是配置错,而是环境差异导致链接没生成或权限丢失:
-
composer install --no-dev后,如果mytool依赖dev-only包(比如phpunit),脚本可能因autoload失败而退出,但Composer不报错 - 某些CI镜像用
rsync或tar同步vendor/,会丢掉执行位——临时修复:chmod +x vendor/bin/*,但应查清源头(比如Dockerfile里漏了chmod) - 脚本里写了
require 'vendor/autoload.php'——全局安装时这路径就错了,得用__DIR__.'/../vendor/autoload.php'或Composer自动注入的autoload路径
全局命令(如直接敲mytool)为什么总失效
因为bin字段只控制软链接位置,不修改$PATH。想全局可用,必须两步走:
- 先
composer global require your-vendor/your-tool(不是composer require --global,后者非法) - 再把
~/.composer/vendor/bin(macOS/Linux)或%APPDATA%\Composer\vendor\bin(Windows)加进系统PATH,且新开终端生效
最容易被忽略的一点:全局命令运行时加载的是~/.composer/vendor/autoload.php,不是你当前项目的vendor/autoload.php——所有依赖和类加载都基于全局vendor目录,而非项目目录。










