bin字段将脚本软链接至vendor/bin/目录,需确保目标有shebang和执行权限,且路径为项目根目录下的相对路径;vendor/bin须加入$path或用./vendor/bin/显式调用。

composer.json 里的 bin 字段到底绑定到哪?
它不直接让你在终端敲 mytool 就运行,而是把指定脚本软链接进 vendor/bin/ —— 这个目录本身不在系统 $PATH 里,除非你手动加,或者用 Composer 自带的 install --bin-dir 控制位置。
- 默认行为:执行
composer install后,bin下列出的文件(比如src/mytool)会被符号链接到vendor/bin/mytool - 真实路径必须可执行:目标文件得有 shebang(如
#!/usr/bin/env php),且有执行权限(chmod +x src/mytool) - Windows 用户注意:
vendor/bin/下生成的是.bat包装器,实际仍调用 PHP 解释器跑原脚本,别指望它能直接跑 bash 特性
为什么 vendor/bin/mytool 执行报错 “Command not found”?
大概率是 vendor/bin/ 没进你的 shell $PATH,或者当前终端没重载配置。不是 Composer 没生效,是系统根本找不到这个命令。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 临时解决:
./vendor/bin/mytool(加./显式指明路径) - 长期方案:把
$(pwd)/vendor/bin加进 shell 配置(如~/.zshrc),然后source ~/.zshrc - 项目级偷懒:用 Composer 脚本封装,比如在
composer.json的scripts里写"mytool": "mytool",再用composer mytool呼叫
bin 字段值写相对路径还是绝对路径?
只能写**项目根目录下的相对路径**,而且是相对于 composer.json 所在位置。写 ../src/mytool 或 /abs/path 都会静默失败,Composer 不报错,但链接不会生成。
- 正确写法:
"bin": ["bin/mytool"](对应项目根目录下bin/mytool) - 常见误操作:把脚本放在
src/Console/MyTool.php,却填"bin": ["src/Console/MyTool.php"]—— 这个文件不是可执行脚本,只是类定义,必须另写一个 CLI 入口文件去 require 它 - 推荐结构:
bin/mytool是薄入口(含 shebang + autoload + new CliApp()),src/放逻辑,解耦清晰
多个包共用 vendor/bin,名字冲突怎么破?
Composer 不做去重或命名空间隔离,后安装的包如果 bin 名和已有文件同名,会直接覆盖符号链接——你上次还能用的 phpunit,可能被另一个包悄悄替换成它的版本。
- 查冲突:
ls -la vendor/bin/看链接指向哪个包的文件 - 避免覆盖:在
composer.json里用bin-compat(需 Composer 2.2+)设为"full",让 Composer 为每个包生成带包名前缀的二进制(如monolog-logger) - 更稳做法:不用全局
vendor/bin,改用composer exec mytool(Composer 2.5+),它按包名精确调用,不依赖符号链接
chmod +x,或者忘了 source 配置,就足够让人对着黑屏发三分钟呆。










