<p>Composer脚本需用composer run-script script-name -- --arg=value透传参数,PHP中通过$argv获取并array_shift()去除脚本路径,Windows下须用双引号包裹参数或改用WSL/Git Bash。</p>

composer.json 里定义脚本时怎么接收参数
Composer 脚本本身不解析命令行参数,composer run-script 后面跟的任何内容,都会原样透传给被调用的命令(PHP 脚本、Shell 命令等),但前提是脚本声明方式正确。
常见错误是写成:"scripts": {"build": "php build.php"} —— 这样 composer build -- --env=prod 中的 -- --env=prod 会被 Composer 忽略,根本传不到 build.php。
必须显式加 -- 分隔符,且脚本值要支持参数转发:
- PHP 脚本:用
php build.php -- --env=prod(注意两个--),第一个是 Composer 的分隔符,第二个才进 PHP - 推荐写法:
"build": "php build.php",然后运行composer build -- --env=prod - Shell 命令同理,比如
"test": "phpunit"→composer test -- --filter=testFoo
PHP 脚本里怎么拿到这些参数
$argv 是唯一可靠入口,别依赖 $_SERVER['argv'] 或自定义解析逻辑——Composer 不改环境变量,只拼接命令行字符串。
示例 deploy.php:
#!/usr/bin/env php
<?php
array_shift($argv); // 去掉 'php deploy.php'
if (empty($argv)) {
die("Missing args. Usage: composer deploy -- --env=staging --branch=main
");
}
parse_str(implode('&', $argv), $args);
$env = $args['env'] ?? 'dev';
$branch = $args['branch'] ?? 'main';
echo "Deploying $branch to $env
";关键点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
array_shift($argv)必须做,否则第一个元素是脚本路径 - 不要假设参数格式是
--key=value,Composer 只负责透传,实际解析由你控制 - 如果用
symfony/console,得自己 new Application() 并 run,不能靠 Composer 自动集成
为什么 composer run-script 和直接 composer xxx 行为不同
两者底层都是调用 run-script,但快捷命令(如 composer test)会跳过参数校验和分隔符处理逻辑,导致 -- 容易被吃掉或误解。
实操建议:
- 统一用
composer run-script <script-name> -- <your-args>,明确可控 - 避免定义同名快捷脚本(如
"test": "phpunit")后又想传参,容易混淆 - CI/CD 中尤其要注意:GitLab CI 的
COMPOSER_ARGS环境变量不会自动注入到脚本参数里,得手动拼进命令
Windows 下传参失败的典型表现和修复
错误现象:composer deploy -- --env=prod 在 Windows CMD 或 PowerShell 里执行,PHP 脚本收到空 $argv 或只收到 --env=prod(漏掉 --)。
根本原因是 Windows 的命令行解析器对引号和等号处理更敏感。解决方案只有两个:
- 强制用双引号包裹整个参数:
composer deploy -- "--env=prod --branch=release" - 改用 Git Bash 或 WSL 执行,避开 CMD 解析陷阱
- 在
composer.json中改用封装脚本:"deploy": "php -r "parse_str(\"env=prod&branch=main\", \$a); echo \$a['env'];""(仅调试用,不推荐生产)
最稳的路是:开发环境统一用 WSL/Git Bash,CI 流水线用 Linux runner,绕开 Windows 参数解析这个老坑。

















