Composer run-script自定义参数 传递参数给脚本方法【技巧】

10次阅读

必须使用 — 分隔符透传参数,如 composer run-script build — –env=prod;php 脚本通过 $argv 接收,$argv[1] 起为原始参数,需自行解析;其他写法均会被 Composer 拦截或忽略。

Composer run-script自定义参数 传递参数给脚本方法【技巧】

composer run-script 怎么传参数给 PHP 脚本

直接在命令行里加 -- 分隔符,后面跟的参数会原样透传到脚本中,不会被 Composer 解析。这是唯一可靠的方式,其他写法(比如 composer run-script foo --arg=val)会被 Composer 拦截或忽略。

例如你的 scripts 定义是:

"scripts": {   "build": "php build.php" }

执行时要传 --env=prod,就得这样写:

composer run-script build -- --env=prod

注意:中间两个短横线 -- 是必须的,缺一不可;它告诉 Composer “后面的都别碰,全交给脚本”。

PHP 脚本里怎么接收这些参数

Composer 不做任何参数解析或转换,只是把 -- 后面的内容原样塞进 $argv。所以你的 build.php 需要自己处理:

  • $argv[0] 是脚本路径(如 build.php
  • $argv[1] 开始才是你传的参数(如 --env=prod
  • 推荐用 getopt() 或更轻量的 parse_str(implode('&', array_slice($argv, 1)), $opts) 快速提取键值对

简单示例:

$opts = []; foreach (array_slice($argv, 1) as $arg) {   if (str_starts_with($arg, '--')) {     [$key, $val] = explode('=', substr($arg, 2), 2) + ['', ''];     $opts[$key] = $val ?: true;   } } // $opts['env'] === 'prod'

常见踩坑:参数被 Composer 吃掉或报错

以下写法都会失败:

  • composer run-script build --env=prod--env 被 Composer 当作自身选项,报错“unrecognized option”
  • composer run-script build -e prod → 短参数不支持,且没 -- 分隔,直接被忽略
  • composer run-script build "--env=prod" → 引号没用,仍会被 Composer 解析

唯一正确姿势就是:-- 单独成项,后面所有内容才安全透传。

windows 下额外注意空格和引号

PowerShell 或 cmd 中,如果参数含空格(比如 --message="hello world"),必须用双引号包裹整个参数项,并确保 -- 仍独立存在:

composer run-script build -- "--message=hello world"

否则 windows 命令行可能把空格当作分隔符,导致 $argv 错位。mac/linux 一般无此问题,但统一加引号更稳妥。

真正容易被忽略的是:-- 不是可选语法糖,它是 Composer 参数透传的开关,漏掉就等于没传参。

text=ZqhQzanResources