Composer不直接支持参数透传,但可通过环境变量继承、--分隔符向外部命令传参、封装CLI工具及利用config字段实现灵活配置。

Composer 脚本本身不直接支持命令行参数或环境变量的“透传”,但可以通过几种实用方式间接实现——关键在于区分“运行时传参”和“环境配置”,并合理利用 Composer 的执行机制。
在脚本中读取环境变量
Composer 执行脚本时会继承当前 shell 的环境变量,因此 PHP 脚本里可以直接用 getenv() 或 $_ENV 读取:
- 在
composer.json中定义脚本,例如:"scripts": { "build": "php build.php" } - 在
build.php中获取变量:$mode = getenv('APP_ENV') ?: 'prod';
echo "Building for {$mode}...\n"; - 调用时设置环境变量:
APP_ENV=dev composer build(Linux/macOS)
或set APP_ENV=dev && composer build(Windows CMD)
用 -- 向脚本传递参数(仅限外部命令)
Composer 支持在调用脚本时用 -- 分隔符向后续命令传递参数,但**只对直接调用的可执行命令生效(如 PHP、Node.js),不适用于内联 PHP 代码**:
- ✅ 有效写法(调用独立 PHP 文件):
"scripts": { "run": "php cli.php" }
执行:composer run -- --verbose --port=8080
在cli.php中可用$argv接收:var_dump($argv); // ['cli.php', '--verbose', '--port=8080'] - ❌ 无效写法(内联 PHP 不解析 -- 后内容):
"scripts": { "bad": "php -r \"var_dump($argv);\"" }
此时$argv始终只有['-r'],-- 后参数被忽略
用脚本参数替代硬编码(推荐封装为命令行工具)
更可靠的方式是把逻辑封装成带参数解析的 CLI 工具,再由 Composer 调用:
- 创建
bin/deploy(带 shebang,chmod +x):#!/usr/bin/env php
$argv = $_SERVER['argv'];
$target = $argv[2] ?? 'staging';
echo "Deploying to {$target}\n"; - 在
composer.json中声明:"scripts": { "deploy": "bin/deploy" } - 调用:
composer deploy production→$argv[2]就是production
结合 scripts 和 config 实现条件行为
Composer 自身的 config 字段可设变量,配合脚本判断简化多环境操作:
- 在
composer.json中添加:"config": { "app-env": "local" } - PHP 脚本中读取:
$json = json_decode(file_get_contents('composer.json'), true);
$env = $json['config']['app-env'] ?? 'prod'; - 也可用
composer config app-env dev动态修改,适合 CI/CD 中临时覆盖
基本上就这些。核心是:环境变量靠系统继承,参数传递靠 -- + 外部命令或自建 CLI,硬编码配置可放 config 段。不复杂但容易忽略细节。










