Composer脚本接收参数必须用--显式分隔且脚本定义含@phpscript或@php,PHP中通过$argv手动解析,需array_shift清理后使用getopt等健壮方式处理。

Composer 中文镜像本身不传递参数,脚本能否接收参数、怎么接收,完全取决于你如何写 composer.json 里的脚本定义和 PHP 脚本本身的解析逻辑——镜像只管下载,不管传参。
composer run-script 怎么透传 --env=prod 这类参数
必须用 -- 显式分隔,否则参数被 Composer 自身吃掉:
-
composer run-script deploy -- --env=prod✅ 正确:双横线后的内容原样进$argv -
composer run-script deploy --env=prod❌ 错误:Composer 把--env=prod当作自己的选项,脚本收不到 - Windows CMD 下等号易被截断,建议用 PowerShell 或加双引号:
-- "--env=prod"
PHP 脚本里怎么安全读取 --env=prod
别硬索引 $argv[1],先清理再解析:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须
array_shift($argv)去掉脚本路径(如deploy.php),否则第一个参数永远是文件名 - 推荐用
getopt():比如getopt("e:f", ["env:", "force"]),比手撕$argv更健壮 - 别依赖
$_SERVER['argv']—— 它可能混入 Composer 启动路径(如/usr/bin/composer),不可控 - 脚本开头加
@phpscript或用@php deploy.php声明,否则--后的参数根本进不来
CI/CD 中脚本不交互?别只靠 --no-interaction
--no-interaction 只影响 Composer 自身行为(比如删 vendor 前是否确认),对 post-install-cmd 里的脚本无效:
- 真正生效的是环境变量:
COMPOSER_NO_INTERACTION=1强制全局关闭 - Docker 构建时若没加
-t,posix_isatty(STDIN)返回false,脚本可能直接跳过交互逻辑 - 管道命令(如
composer install | cat)会重定向 stdin,同样导致交互失效 - 想跳过某特定脚本的交互?看它是否支持
SkipInteractiveSetup=1这类包级环境变量
最容易被忽略的是:中文镜像加速的是下载链路,而脚本执行超时、参数丢失、交互卡死,全在另一条链路上——它不走镜像,也不受 repo.packagist 配置影响。配完镜像后脚本仍出问题,得回头查 run-script 写法、$argv 处理、以及 CI 环境的 stdin 状态。

















