Composer 的 run-script 命令通过 -- 分隔符透传参数给脚本,$argv 或 $@ 可获取原始参数,需脚本自行解析;省略 -- 会导致参数被 Composer 错误解析,硬编码参数则丧失灵活性。

Composer 的 run-script 命令本身不直接解析参数,但可通过约定方式将参数透传给脚本(如 PHP、Shell 或自定义命令),关键在于“双横线(--)分隔符”和脚本端的正确接收逻辑。
用 -- 分隔符传递参数给脚本
Composer 会把 -- 后面的所有内容原样传递给目标脚本,不作任何解析。这是最标准、最可靠的方式:
- 在
composer.json中定义脚本,例如:"scripts": { "greet": "php greet.php" } - 执行时加
--和参数:composer run-script greet -- --name=alice --verbose - 此时
greet.php中可通过$argv(PHP)或$@(Shell)获取--name=alice --verbose等原始参数
在 PHP 脚本中解析透传参数
PHP 脚本需自行处理 $argv。注意:Composer 执行时,$argv[0] 是脚本路径,$argv[1] 开始才是透传参数:
- 示例
greet.php:$opts = getopt('',['name:','verbose']);
echo "Hello, " . ($opts['name'] ?? 'World') . "!\n";
if (isset($opts['verbose'])) echo "Mode: verbose\n"; - 调用:
composer run-script greet -- --name=bob --verbose
输出:Hello, bob!和Mode: verbose
支持环境变量 + 参数混合使用
可同时用环境变量控制行为,再用 -- 传动态参数,两者互不干扰:
- 设置环境变量并传参:
APP_ENV=prod composer run-script deploy -- --tag=v2.1.0 --force - PHP 脚本中:
getenv('APP_ENV')获取prod,getopt()解析命令行参数 - 适合区分环境(dev/staging/prod)与操作粒度(如部署特定 tag)
避免常见陷阱
以下写法容易出错,需特别注意:
- ❌ 错误:省略
--分隔符 ——composer run-script greet --name=alice
Composer 会尝试解析--name为自身选项(报错或忽略),参数无法到达脚本 - ❌ 错误:在 script 字段里硬编码参数 ——
"greet": "php greet.php --name=alice"
失去灵活性,每次改参数都要改composer.json - ✅ 正确:始终用
--显式分隔;脚本保持参数解析能力;复杂逻辑建议封装为独立可执行文件
不复杂但容易忽略。核心就一条:参数必须跟在 -- 后面,脚本自己负责解析,Composer 只做透明管道。










