Composer 的 exec 命令用于直接运行 vendor/bin/ 下的可执行文件,自动定位路径、匹配 PHP 解释器,支持传参和跨平台,简化如 phpunit 等工具调用,避免 PATH 或版本问题。

Composer 的 exec 命令用来**直接运行 vendor/bin/ 目录下的可执行文件**,无需手动指定完整路径,也不用管 PHP 版本或环境变量是否配置正确。
自动定位并执行 vendor/bin 下的工具
很多 Composer 包(比如 PHPUnit、PHPStan、Laravel Sail、Symfony CLI)安装后会在 vendor/bin/ 生成一个可执行脚本。以前你可能得这样运行:
而用 composer exec 就可以简化为:
它会自动查找并执行匹配的二进制文件,还支持传参,比如:
composer exec phpunit -- --testdox跨平台兼容,不依赖 PATH 配置
有些系统没把 vendor/bin 加入 PATH,或者用了不同 PHP 版本导致命令找不到。composer exec 内部用当前 Composer 使用的 PHP 解释器来执行,避免环境混乱。它本质上是帮你做了:
- 找到正确的 PHP 可执行文件(和 composer 一致)
- 拼出
vendor/bin/xxx的绝对路径 - 用该 PHP 运行那个脚本(对 PHP 脚本有效)或直接调用(对可执行二进制也支持)
支持别名和自定义命令(通过 scripts)
虽然 exec 本身不读 composer.json 的 scripts,但你可以把它和 scripts 结合用。例如在 composer.json 中写:
然后运行 composer test,就等价于 composer exec phpunit -- --stop-on-failure。适合团队统一命令入口。
注意几个常见情况
- 如果同名命令多个(比如
phpunit和phpunit7),它默认选第一个匹配的,不提示冲突 - 不是所有
vendor/bin/下的文件都能直接 exec —— 比如 shell 脚本需系统支持,Windows 上某些 .bat 可能行为不同 - 想看它到底执行了什么?加
-v参数:composer exec -v phpunit
基本上就这些。不用额外配置,不污染全局环境,适合 CI/CD 或本地快速调试。










