必须清缓存、删 vendor 后重装才生效;项目配置优先于全局,路径须为相对路径;PATH 未更新则命令仍不可用;Windows 下应避免空格/中文路径。

改 bin-dir 不等于命令立刻可用,必须删 vendor 重装 + 手动加 PATH,否则脚本根本不会出现在新目录里,终端也找不到命令。
怎么让自己的脚本进 bin 目录(不是 vendor/bin)
关键不是“放文件”,而是让 Composer 认出它是可执行入口。三个条件缺一不可:
-
composer.json中声明"bin": ["bin/mytool"],路径必须是项目根目录下的相对路径,不能写./bin/mytool或绝对路径 -
bin/mytool文件真实存在,且第一行是有效的 shebang,比如#!/usr/bin/env php - Linux/macOS 下必须执行
chmod +x bin/mytool;Windows 下可接受.php后缀,但推荐用.bat包装更稳
漏掉任意一条,composer install 后 bin/ 目录里都不会生成链接或脚本。
为什么改了 bin-dir 后 bin/ 还是空的
这不是配置失效,而是 Composer 的行为逻辑被误解了:bin-dir 只控制「新安装或更新」时的链接位置,对已存在的 vendor/ 完全无感。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 常见误操作:改完
"config": {"bin-dir": "bin"}就直接跑composer install,结果vendor/bin里的旧文件还在,bin/却空着 - 正确流程:先
composer clear-cache,再rm -rf vendor(注意是整个vendor,不是只删vendor/bin),最后composer install - Windows 用户额外注意:路径里不能有空格或中文,斜杠必须用正斜杠
/,比如"bin-dir": "tools"可以,"bin-dir": "my tools"会静默失败
终端敲 mytool 还是报 command not found
bin-dir 只管“放哪”,不管“怎么调用”。系统不认识命令,99% 是因为 PATH 没包含你的新目录。
- 临时生效(当前终端):
Linux/macOS:export PATH="$(pwd)/bin:$PATH"
Windows CMD:set PATH=%cd%\bin;%PATH% - 长期生效要写进 shell 配置(如
~/.zshrc),但协作项目中别用$(pwd)——别人 clone 下来路径就变了;更稳妥的是用绝对路径,比如export PATH="/home/user/project/bin:$PATH" - IDE(如 PHPStorm、VS Code)通常不读你的 shell 配置,得重启 IDE,或单独在 IDE 设置里配环境变量
- CI/CD 脚本里别依赖
PATH,统一用./bin/mytool或composer exec mytool,后者还能保证用项目锁死的 PHP 版本
某些包的命令还是跑到 vendor/bin?它不认 bin-dir
不是所有包都走标准流程。真正受 bin-dir 控制的,只有那些在 composer.json 里明确写了 "bin" 字段的包(如 phpunit/phpunit)。而有些包靠 post-install-cmd 脚本硬拷贝二进制,会绕过配置,直接写进 vendor/bin。
- 验证方法:删掉
vendor/bin,再跑composer install,然后ls -l bin/看有没有链接生成 - 如果
bin/仍为空,说明该包没声明bin字段,改配置也没用 - Windows 下还多一层:Composer 生成的是
bin/phpunit.bat,不是可执行文件,得敲phpunit.bat或把.BAT加进PATHEXT
最容易被忽略的点:项目级 bin-dir 配置优先于全局,但它只影响当前项目;你改错位置(比如在非项目根目录下运行 composer config bin-dir),实际写进的是全局配置,项目里压根不生效。

















