首页 关于我们 成功案例 网络营销 电商设计 新闻中心 联系方式
QQ联系
电话联系
手机联系

Composer run-script命令如何接收和传递命令行参数?(高级用法)

发布时间:2026-01-05 00:00
发布者:裘德小鎮的故事
浏览次数:
Composer 的 run-script 命令通过 -- 分隔符透传参数给脚本,$argv 或 $@ 可获取原始参数,需脚本自行解析;省略 -- 会导致参数被 Composer 错误解析,硬编码参数则丧失灵活性。

Composer 的 run-script 命令本身不直接解析参数,但可通过约定方式将参数透传给脚本(如 PHP、Shell 或自定义命令),关键在于“双横线(--)分隔符”和脚本端的正确接收逻辑。

-- 分隔符传递参数给脚本

Composer 会把 -- 后面的所有内容原样传递给目标脚本,不作任何解析。这是最标准、最可靠的方式:

  • composer.json 中定义脚本,例如:
    "scripts": { "greet": "php greet.php" }
  • 执行时加 -- 和参数:
    composer run-script greet -- --name=alice --verbose
  • 此时 greet.php 中可通过 $argv(PHP)或 $@(Shell)获取 --name=alice --verbose 等原始参数

在 PHP 脚本中解析透传参数

PHP 脚本需自行处理 $argv。注意:Composer 执行时,$argv[0] 是脚本路径,$argv[1] 开始才是透传参数:

  • 示例 greet.php
    
    $opts = getopt('',['name:','verbose']);
    echo "Hello, " . ($opts['name'] ?? 'World') . "!\n";
    if (isset($opts['verbose'])) echo "Mode: verbose\n";
  • 调用:composer run-script greet -- --name=bob --verbose
    输出:Hello, bob!Mode: verbose

支持环境变量 + 参数混合使用

可同时用环境变量控制行为,再用 -- 传动态参数,两者互不干扰:

  • 设置环境变量并传参:
    APP_ENV=prod composer run-script deploy -- --tag=v2.1.0 --force
  • PHP 脚本中:getenv('APP_ENV') 获取 prodgetopt() 解析命令行参数
  • 适合区分环境(dev/staging/prod)与操作粒度(如部署特定 tag)

避免常见陷阱

以下写法容易出错,需特别注意:

  • ❌ 错误:省略 -- 分隔符 —— composer run-script greet --name=alice
    Composer 会尝试解析 --name 为自身选项(报错或忽略),参数无法到达脚本
  • ❌ 错误:在 script 字段里硬编码参数 —— "greet": "php greet.php --name=alice"
    失去灵活性,每次改参数都要改 composer.json
  • ✅ 正确:始终用 -- 显式分隔;脚本保持参数解析能力;复杂逻辑建议封装为独立可执行文件

不复杂但容易忽略。核心就一条:参数必须跟在 -- 后面,脚本自己负责解析,Composer 只做透明管道。


# php  # js  # json  # composer  # 编码  # app  # 环境变量  # echo  # if  # 封装  # 命令行参数  # 分隔符  # 可通过  # 这是  # 都要  # 才是  # 自定义  # 会把  # 再用  # 报错  # 不作