环境变量不生效的典型表现是post-install-cmd中echo $APP_ENV输出空字符串、$_ENV['APP_ENV']报Undefined index、CI提示“missing required env”;根本原因是Composer不自动继承shell环境或解析.env文件,必须显式通过APP_ENV=prod composer install等方式传入。

composer install 时环境变量不生效的典型表现
运行 composer install 后,post-install-cmd 脚本里 echo $APP_ENV 输出空字符串;PHP 脚本中 $_ENV['APP_ENV'] 报 Undefined index;CI 流水线里提示 “missing required env”——这些都不是 .env 文件没写对,而是 Composer 根本没把变量传进去。
必须显式传入,不能依赖 .env 或 shell 环境
Composer 不解析项目根目录的 .env 文件,也不自动继承当前 shell 的环境变量(哪怕你执行过 export APP_ENV=prod)。它只认命令行前缀的变量赋值:
-
APP_ENV=prod composer install—— 最简、最可靠,变量仅对本次命令生效 -
APP_ENV=staging DB_HOST=localhost composer install—— 多变量用空格分隔,注意不要用&&或分号 - 在 GitHub Actions 中,必须写
env:块:env:<br> APP_ENV: 'ci'<br> CI: 'true'
,不能靠run: composer install自动带出 - Docker 中,
docker run --env APP_ENV=dev ...或docker-compose.yml的environment: [APP_ENV=dev]才有效;.env文件只是 docker-compose 的变量替换源,不进容器进程环境
哪些 composer.json 字段真正支持 ${VAR} 插值
不是所有配置项都能写 ${FOO}。只有明确文档标注“支持运行时变量”的字段才有效,误用会静默失败或报错:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 支持插值:
config.http-basic(如私有仓库认证)、repositories[].url(如"${PRIVATE_REPO_URL}")、config.process-timeout(值必须是纯数字字符串) - 不支持插值:
config.repos、config.github-protocols、scripts里的命令字符串本身("post-install-cmd": "APP_ENV=${APP_ENV} php foo.php"是错的,shell 层不会展开这个${APP_ENV}) - 脚本中要用环境变量,得靠外部传入,再由 PHP 自己读取:
post-install-cmd: php artisan config:clear+ 外部APP_ENV=prod composer install
vendor/autoload.php 里永远拿不到 .env 变量
这是最容易被误解的一点:vendor/autoload.php 是 Composer 自动生成的类加载器,它不加载、不解析、不注入任何环境变量。即使你用了 vlucas/phpdotenv,也必须在应用入口(如 public/index.php)显式调用 Dotenv::createImmutable(__DIR__)->load(),否则 getenv() 和 $_ENV 仍是空的。
想在 composer install 阶段就让环境变量可用?唯一正解是:把变量传给 Composer,再让它透传给 scripts;别指望 autoload 或 .env 文件自己“活过来”。

















