vendor/bin 存放项目依赖中声明了"bin"字段的cli工具入口脚本,由composer自动创建符号链接,路径需真实存在且具执行权限,不满足则链接失效;它不存放php类或配置文件。

vendor/bin 存的是项目依赖里声明的 CLI 工具入口脚本,不是 PHP 类、不是配置、也不是自动加载文件——它只放能直接敲命令运行的东西。
vendor/bin 里的文件从哪来?
它们来自你 composer require 的包,前提是那个包在自己的 composer.json 里写了 bin 字段,比如:
"bin": ["phpunit", "psalm", "php-cs-fixer"]
Composer 安装时会检查这些路径是否真实存在、是否有执行权限(chmod +x)、第一行是不是有效的 shebang(如 #!/usr/bin/env php),然后在 vendor/bin/ 下建符号链接。不满足任一条件,链接就静默失败——ls -l vendor/bin/phpunit 会显示 No such file or directory。
- 脚本必须放在包的根目录或
bin/子目录下,不能写"bin": ["src/Console/App.php"] - 路径是精确匹配的,不补
.php,不解析命名空间,也不走 autoload - 多个包声明同名 bin(如都叫
foo),后安装的会覆盖前一个,无提示
为什么 ./vendor/bin/phpunit 能跑,但直接敲 phpunit 报 command not found?
因为系统 $PATH 没包含 ./vendor/bin。这不是 Composer 故意设的障,而是 shell 查找可执行文件的基本规则:只查 $PATH 列表里的目录。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 临时解决:
export PATH="./vendor/bin:$PATH(当前终端有效) - 永久生效:加到
~/.zshrc或~/.bashrc,再source ~/.zshrc - 注意:
./vendor/bin是相对路径,换目录就失效;用$(pwd)/vendor/bin虽然绝对,但协作项目中容易污染其他人的环境 - 更稳妥的做法是:始终用
./vendor/bin/phpunit,或在composer.json的scripts里封装,比如"test": "phpunit",然后运行composer test
能改 vendor/bin 的位置吗?
可以,通过 config.bin-dir 配置项,比如:
"config": { "bin-dir": "tools" }
但这不是“重定向”,而是告诉 Composer:“把所有 bin 脚本软链到项目下的 tools/ 目录”。它不会自动创建该目录,也不会更新你的 $PATH。
- 必须手动
mkdir tools,且确保有写权限,否则composer install报Could not create bin dir - 改完要删掉
vendor/并重新composer install,否则旧链接还在原处不动 - 某些工具(如 Laravel Sail)硬编码找
vendor/bin,改了可能直接 break - 全局 bin(如
composer global require laravel/installer)走的是~/.composer/vendor/bin,和这个配置无关
真正容易被忽略的一点:vendor/bin 下的文件是软链接,不是复制。一旦你删了源包(比如清了 vendor 再重装),链接就断了——但 composer install 会重建它们。所以别手动去 vendor/bin 里增删改文件,那只是徒劳。










