composer run-script 默认不传参,因其解析时截断--后自定义参数;可靠方式为:一、scripts中用{$argv}占位符(v2.2+);二、composer exec(v2.5+)透传参数。

Composer 脚本本身不支持直接传参(比如 composer run-script foo -- --env=prod 中的 --env=prod 默认被忽略),必须显式启用 --no-interaction 之外的参数透传机制,否则所有额外参数都会被丢弃。
为什么 composer run-script 默认不传参
Composer 的 run-script 命令在解析时会提前截断 -- 后的内容——除非你用 --no-ansi、--quiet 这类内置标志,否则自定义参数根本进不到脚本执行环境。这是设计使然,不是 bug。
-
composer run-script build -- --force→--force不会出现在$argv或$_SERVER['argv']中 - 只有加了
--no-interaction等 Composer 自己认的 flag,才会被保留;其余一律剥离 - PHP 脚本里用
getopt()或$argv拿不到用户传的参数,因为 Composer 根本没把它们传进去
正确传参的两种可靠方式
绕过默认限制,只有两个被验证稳定的路径:用 scripts 定义带占位符的命令,或改用 composer exec(v2.5+)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 方式一:在
composer.json的scripts里写 shell 命令,用{$argv}占位符(仅限 Composer v2.2+)"scripts": { "deploy": "php deploy.php {$argv}" }然后运行:composer run-script deploy -- --env=staging --tag=v1.2→deploy.php会收到完整['--env=staging', '--tag=v1.2'] - 方式二:用
composer exec(推荐,更干净)"scripts": { "deploy": "php deploy.php" }再执行:composer exec -- php deploy.php --env=staging --tag=v1.2→ 参数原样透传,且不触发脚本钩子逻辑干扰 - 注意:
{$argv}只展开--后的内容,不会包含composer run-script自身的选项(如-v)
PHP 脚本里怎么安全读取这些参数
别依赖全局 $argv——它可能混入 Composer 的启动参数(尤其在 Windows 或某些容器环境)。优先用 $_SERVER['argv'] 并手动过滤,或直接用 getopt() 解析。
- 用
getopt()更健壮(支持短/长选项):$options = getopt('e::t::', ['env::', 'tag::']); // $options = ['env' => 'staging', 'tag' => 'v1.2'] - 如果坚持用
$argv,记得跳过前两个元素:array_slice($argv, 2)(因为$argv[0]是脚本路径,$argv[1]是composer调用名) - Windows 下 CMD 会吃掉等号,建议用空格分隔:
--env staging而非--env=staging,并用getopt('e::', ['env::'])配合双冒号接收可选值
真正麻烦的不是传参动作本身,而是不同 Composer 版本对 {$argv} 的支持程度不一致,以及 Windows 和 Linux 在 shell 解析上的细微差异。上线前务必在目标环境实测 composer --version 和实际参数落地结果。










