vendor/bin 是 Composer 自动创建的目录,用于存放依赖包通过 composer.json 中 "bin" 字段声明的可执行脚本,安装时软链接(Linux/macOS)或生成 .bat(Windows)至该目录,实现项目级 CLI 工具版本隔离。
Composer 的
目录不是“放脚本的地方”那么简单,它是 PHP 项目实现 CLI 工具版本隔离的核心机制——每个项目用自己依赖的工具版本,互不干扰。
vendor/bin 是怎么生成的?
它完全由 Composer 自动创建和维护,前提是所安装的包在自己的
中声明了
字段。比如
包里有:
当你运行
,Composer 就会把该包下的
文件(路径通常为
)软链接到
(Linux/macOS)或生成对应的
包装脚本(Windows)。
常见误判:
不是手动建的,也不该提交进 Git;删掉后运行
会自动重建
没出现在
的工具,大概率是它所属的包根本没写
字段(如
)
脚本文件名必须与
字段值**完全一致**,不自动补
,不支持通配符
为什么全局安装后命令还是找不到?
因为 Composer 从不修改系统
。全局安装(
)生成的可执行文件实际放在:
Linux/macOS:
Windows:
但这些路径不在默认
里。验证方式:
macOS/Linux:运行
,看输出是否含
Windows:运行
,确认含对应路径
修复方法:
Composer 2.9.6
Composer 2.9.6 是 PHP 生态中高效、稳定的依赖管理工具。此版本在性能与兼容性上进一步优化,改进了依赖解析算法,提升大型项目中的安装与更新速度。它支持并行下载任务,显著减少等待时间,并增强了与私有仓库及镜像源的交互稳定性。同时修复了多项命令行交互与内存使用相关的缺陷,确保在复杂依赖关系下依然可靠运行。无论是新项目初始化还是现有系统维护,Composer 2.9.6 都能为开发者提供流畅、精准的依赖管理体验。
下载
macOS/Linux:在
或
末尾加
,再运行
Windows:系统属性 → 高级 → 环境变量 → 用户变量中编辑
,新增一行粘贴完整路径
改完必须新开终端,旧终端不会刷新
。
如何安全地调用 vendor/bin 下的命令?
直接敲
看似方便,但隐含风险:它依赖你是否把
或全局
目录加入了
,且容易和系统其他同名命令冲突。更可靠的方式有三种:
显式路径调用:
—— 最稳定,CI/CD 必选
用
:
—— Composer 自动定位、透传参数、兼容 Windows
,适合多环境
封装进
的
:
,然后运行
—— 对团队友好,隐藏路径细节
注意:
不会触发
中定义的
,它只代理执行
下的二进制文件。
自定义 bin-dir 后要注意什么?
你可以通过
的
改变位置,比如设为
。但这只是改了链接存放地,不是魔法开关:
改完必须运行
或
,否则新目录为空,旧
还在
新路径(如
)不会自动加入
,你要手动加,否则命令仍不可见
Windows 下生成的是
,不是可执行文件,某些 shell 补全可能识别不了
多个包声明同名
(如都叫
),后安装的会覆盖前一个,无提示
真正容易被忽略的是:bin-dir 的变更对已运行的终端进程完全无效,PATH 没更新、链接没重建、.bat 没生成——三者缺一,命令就“消失”。别猜,用
或
看真实文件,再用
或
查找路径,比反复重装 Composer 实在得多。
vendor/bincomposer.jsonbinphpunit/phpunit"bin": ["phpunit"]composer require --dev phpunit/phpunitphpunitvendor/phpunit/phpunit/phpunitvendor/bin/phpunit.batvendor/bincomposer installvendor/binbinmonolog/monologbin.phpPATHcomposer global require phpunit/phpunit~/.composer/vendor/bin/%APPDATA%\Composer\vendor\binPATHecho $PATH~/.composer/vendor/binecho %PATH%~/.zshrc~/.bashrcexport PATH="$HOME/.composer/vendor/bin:$PATH"source ~/.zshrcPATHPATHphpunitvendor/binbinPATH./vendor/bin/phpunit tests/composer execcomposer exec phpunit tests/.batcomposer.jsonscripts"test": "phpunit"composer testcomposer execcomposer.jsonscriptsvendor/bincomposer.jsonconfig.bin-dir"bin-dir": "tools"composer installcomposer updatevendor/bintoolsPATHtools/phpunit.batbinfools -l vendor/bindir toolswhich phpunitwhere phpunit