composer 运行自定义脚本需用 composer run 命令名,传参必须加 -- 分隔(如 composer run test:unit -- --filter=testfoo),脚本中引用环境变量应使用 $var(linux/macos)或 php -r 跨平台兼容。

Composer 运行脚本靠 composer run 或 composer run-script,但默认不支持带参数的自定义命令——得手动加 -- 分隔符,否则参数会被 Composer 吞掉。
怎么用 composer run 执行自定义脚本
你在 composer.json 的 "scripts" 里定义的键名,就是可直接运行的命令名。比如:
"scripts": {
"build": "php build.php",
"test:unit": "phpunit --testsuite=unit"
}
执行时不用写完整路径或命令,只输名字就行:
-
composer run build→ 触发php build.php -
composer run test:unit→ 等价于phpunit --testsuite=unit - 别用
composer run-script build,那是旧写法,run更统一、更推荐
为什么传参总失败?关键在 --
想给脚本传参(比如 phpunit --filter=testFoo),直接写 composer run test:unit --filter=testFoo 是错的——Composer 会把 --filter 当成自己的选项,报错或静默忽略。
- 必须加
--显式分隔:composer run test:unit -- --filter=testFoo - 这个
--不是 Composer 的语法糖,是 Unix shell 通用约定,告诉前面的命令“后面全是传给子进程的参数” - 漏掉它,
phpunit根本收不到--filter,只会跑全部用例
composer.json 脚本里怎么引用环境变量或动态值
脚本字段本身支持简单变量展开,但仅限 Composer 内置变量(如 ${COMPOSER_HOME})和 shell 环境变量(需用 $VAR 或 ${VAR}):
-
"scripts": { "debug": "echo $PATH" }→ 在 Linux/macOS 下生效,Windows CMD 不认$ - 跨平台安全写法是用
php -r "echo $_ENV['PATH'] ?? 'no path';" - 避免在脚本里硬编码路径,比如
vendor/bin/phpcs,改用./vendor/bin/phpcs或php ./vendor/bin/phpcs,防止当前目录影响执行 - 如果脚本依赖其他 Composer 命令(如
composer dump-autoload),建议显式调用,别假设它已执行
最常被忽略的是 Windows 用户没意识到 $PATH 和 %PATH% 不互通,以及脚本中混用单双引号导致变量不展开——这些不会报错,但行为和预期完全不同。










