<p>composer run-script 默认不透传参数,必须用 -- 显式分隔;脚本需含 @phpscript 或 @php 才能接收参数,PHP 中应通过 $argv 并 array_shift 处理,环境变量 COMPOSER_SCRIPT_前缀可安全透传。</p>

composer run-script 默认不传参,必须加 -- 分隔符
直接运行 composer run-script deploy --env=prod 是无效的——--env=prod 会被 Composer 当作自身参数吃掉,根本不会透传给你的脚本。唯一生效的方式是显式用 -- 划清边界:composer run-script deploy -- --env=prod。这个 -- 不是可选语法糖,而是强制分隔符,缺它参数就消失。
- 错误写法:
"deploy": "php deploy.php"→ 即使加了--,参数也进不了$argv - 正确写法:
"deploy": "php deploy.php @phpscript"或"deploy": "@php deploy.php"→ 告诉 Composer:“接下来要调 PHP,并把--后面的内容原样塞进去” - Windows 下注意 CMD 对等号和空格敏感,建议用 PowerShell 或包裹双引号:
-- "--env=prod"
PHP 脚本里怎么安全读取 --env=prod 这类参数
$argv 是唯一可靠入口,但不能硬索引 $argv[1] —— 因为脚本可能被其他工具封装、或在不同环境(如 php -r)下调用,数组长度和顺序不稳定。
- 必须先
array_shift($argv)去掉脚本路径(如'deploy.php'),否则第一个参数永远是文件名 - 推荐用
getopt()解析:getopt("e:f", ["env:", "force"]),比手撕parse_str(implode('&', $argv))更健壮 - 别依赖
$_SERVER['argv']:它可能混入 Composer 自身启动路径(如/usr/bin/composer),不可控 - 如果脚本是 Symfony Console 应用(如
bin/console),得自己new Application()并run(),Composer 不自动集成
想跳过交互?别只靠 --no-interaction,还得看环境变量
--no-interaction 只影响 Composer 自身逻辑(比如删 vendor 前是否确认),对第三方包的 post-install-cmd 脚本完全无效——那些脚本是否读 stdin,取决于它自己有没有判断 posix_isatty(STDIN) 或 $io->isInteractive()。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- CI/CD 中常见失效场景:Docker
RUN没加-t,导致posix_isatty(STDIN)返回false;或命令走管道(composer install | cat),stdin 被重定向 - 真正可靠的降级方式是环境变量:
COMPOSER_NO_INTERACTION=1强制全局关闭,或包特定变量如SKIP_INTERACTIVE_SETUP=1、API_KEY=xxx - 某些包支持在
extra字段预设配置:"extra": { "your-package-config": { "host": "api.example.com" } }
post-install-cmd 执行两次?你可能配错了钩子
不是脚本 bug,是事件触发规则被误用。composer install 只触发 post-install-cmd,composer update 和 composer require 都只走 post-update-cmd——如果你把 autoload 相关逻辑(比如生成 classmap)放在 post-install-cmd,update 后类就会找不到。
- 从 Composer 2.2 起,
post-autoload-dump是处理 autoload 的首选钩子,它在每次 autoloader 重建后精准触发 -
post-install-cmd和post-update-cmd的执行时机依赖 lock 文件是否存在,容易混淆;而post-autoload-dump行为稳定、语义清晰 - 别在
scripts里写长 shell 链式命令(如php build.php && npm run build || exit 1),出错时无法定位哪一环失败;拆成独立可测的 PHP 脚本更可控
参数透传的坑不在 Composer 本身,而在 shell 层与 PHP 入口的衔接:分隔符 -- 必须有,@phpscript 必须配,$argv 必须清洗,环境变量才是跨平台最稳的开关。这些点漏一个,脚本就在 CI 里静默失败。

















