Composer脚本中不能用$ENV_VAR语法读取环境变量,必须在PHP代码中使用getenv()或$_SERVER获取;变量由父进程透传,但受SAPI、容器、CI/CD配置影响,需确保正确声明和继承。

Composer 脚本里不能直接用 $ENV_VAR 或 ${ENV_VAR} 这种 shell 风格语法读取环境变量——它压根不经过 shell 解析,而是由 Composer 自己调用 PHP 进程执行,环境变量得靠 PHP 的 getenv() 或 $_SERVER 拿。
Composer 脚本中读取环境变量的正确方式
Composer 执行脚本时,会把当前 shell 的环境变量透传给子进程(PHP),所以变量本身是存在的,只是不能在 scripts 配置值里内联展开。
- ❌ 错误写法:
"php script.php --env=$APP_ENV"($APP_ENV不会被替换) - ✅ 正确写法:在 PHP 脚本内部用
getenv('APP_ENV')或$_SERVER['APP_ENV'] ?? null - 如果必须在命令行参数里动态传入,改用
exec+shell_exec包裹(不推荐,有安全风险) - CI/CD 中建议统一通过
composer install --no-interaction前设置好变量,而非在脚本里“猜”
为什么 composer run-script 看不到你 export 的变量?
常见现象:在终端 export MY_FLAG=1 后运行 composer run-script check-flag,但脚本里 getenv('MY_FLAG') 返回 false。根本原因是 Composer 默认使用 proc_open 启动子进程,而某些 PHP SAPI(尤其是 Apache mod_php)或容器环境会清空或限制继承的环境变量。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 确认是否真没传过去:在脚本开头加
var_dump(array_keys($_SERVER));查看实际收到哪些键 - Linux/macOS 下,确保不是在子 shell 里 export(比如写了
(export X=1; composer run...)) - Docker 中需显式用
environment:或-e透传,docker run -e APP_ENV=prod - GitHub Actions 等平台,变量需在
env:块中声明,不能只写在run:行里
composer.json 中 scripts 的执行上下文限制
Composer 脚本本质是调用 PHP 函数或外部命令,但它不启动完整 CLI 环境——没有 .bashrc、没有 alias、PATH 可能被精简,更不会加载用户 profile 里的变量。
-
"post-install-cmd": "MyClass::doSomething"这类静态方法调用,完全依赖 PHP 运行时环境,getenv()是唯一可靠入口 -
"test": "phpunit"这类外部命令,PATH 和环境变量取决于 Composer 启动时的父进程,和当前 shell 不一定一致 - 避免在 scripts 里写复杂逻辑;需要多变量组合判断时,抽出成独立 PHP 文件,用
require __DIR__.'/script-helper.php';加载更可控 - Windows 用户注意:
set VAR=1 & composer run不生效,必须用set VAR=1 && composer run或改用 PowerShell 的$env:VAR="1"
真正容易被忽略的是:Composer 本身对环境变量没有“注入”机制,它只是被动透传。所谓“脚本里用环境变量”,本质是“PHP 进程里怎么安全拿变量”,而不是“Composer 怎么帮你赋值”。别在 scripts 字段里折腾字符串插值,老老实实进 PHP 再取。

















