composer自定义脚本中获取--后参数需依赖被调用脚本自身解析,$argv[1]起为透传参数,推荐用getopt()或array_slice($argv,1)配合symfony argvinput安全提取。

Composer 自定义脚本里怎么拿到 -- 后面的参数?
Composer 的 scripts 本身不解析 -- 后的参数,它只是原样把整个命令行传给目标程序(比如 PHP 脚本)。真正能拿到 -- 后参数的,是被调用的脚本本身,不是 Composer。
也就是说:你写 "scripts": {"dev:build": "php build.php"},然后运行 composer dev:build -- --env=prod --verbose,Composer 会执行 php build.php -- --env=prod --verbose —— 注意中间那个孤立的 -- 会被保留,它只是 shell 层的分隔符,不是 Composer 解析出来的。
-
--之前的部分(如composer dev:build)由 Composer 解析 -
--之后的部分(如--env=prod --verbose)原封不动交给php build.php,PHP 脚本得自己处理 - 如果没写
--,所有参数都会被 Composer 当作脚本名的一部分,比如composer dev:build --env=prod实际执行的是php build.php --env=prod(但这时--env=prod是脚本参数,不是 Composer 的)
PHP 脚本里怎么安全读取 $argv?
别直接用 $argv[1],因为 -- 可能存在也可能不存在,且位置不固定。推荐用 array_slice($argv, 1) 拿到全部用户参数,再交给 symfony/console 或原生 getopt() 解析。
最轻量的做法(无依赖):
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
#!/usr/bin/env php
<?php // build.php
$rawArgs = array_slice($argv, 1);
<p>// 找到 '--' 分界点,只取其后部分(更严谨时可兼容无 '--' 场景)
$sepIndex = array_search('--', $rawArgs);
$cliArgs = $sepIndex !== false ? array_slice($rawArgs, $sepIndex + 1) : $rawArgs;<p>$options = getopt('v::e::', ['verbose::', 'env::']);
var_dump($options); // ['v' => '', 'env' => 'prod'] 或 ['verbose' => '', 'env' => 'prod']</p>
-
getopt()第二个参数支持长选项(--env),冒号表示带值,双冒号表示值可选 - 如果脚本被当成可执行文件(
chmod +x),记得加 shebang 行 - 不要依赖
$argc和硬编码索引,$argv开头是脚本路径,$argv[0]是build.php,用户参数从$argv[1]开始
为什么 composer run-script 不推荐用于传参?
composer run-script dev:build -- --env=prod 看似合理,但它和 composer dev:build -- --env=prod 行为一致,且多一层封装,容易混淆参数归属。更麻烦的是:run-script 会把 -- 后参数透传,但如果你在 scripts 里用了 shell 语法(比如 "dev:build": "echo 'start' && php build.php"),-- 就会被 shell 当作自身参数截断,根本传不到 PHP。
- 纯 PHP 脚本调用(
"dev:build": "php build.php")才支持--透传 - 含
&&、|、$()的 shell 命令会破坏参数传递,此时必须改用exec或封装成独立命令 - CI/CD 中建议统一用
composer dev:build -- --env=ci,避免run-script带来的歧义
Windows 下 -- 参数传不进去?
Windows 的 CMD 对 -- 支持弱,尤其遇到等号(=)时容易被截断或报错。PowerShell 表现稍好,但仍建议加引号或换用短选项。
- 错误写法:
composer dev:build -- --env=prod(CMD 可能拆成--env和=prod) - 稳妥写法:
composer dev:build -- "--env=prod" "--verbose" - 或改用短选项:
composer dev:build -- -e prod -v,并在 PHP 里用getopt('e:v', ['env:', 'verbose']) - 若项目强依赖 Windows,考虑在
composer.json中用bin字段注册命令,绕过 shell 解析层
参数传递链路是:终端 → Composer → Shell → PHP,每层都可能吃掉或误解 --。最稳的方式,是让 PHP 脚本自己约定参数格式,并在文档里明确写清调用方式。










