Composer 不加载 .env 文件且不自动继承 shell 环境变量,APP_ENV 等需通过命令前赋值(如 APP_ENV=prod composer install)或 CI/CD、Docker 显式声明传递;仅 config 下部分字段支持 ${VAR} 插值,scripts 中变量由 shell 展开;vendor/autoload.php 不加载环境变量,依赖框架手动调用 dotenv。

Composer 本身不加载 .env 文件,也不自动继承 shell 环境变量——你看到的“环境变量生效”,几乎全是项目脚本或框架在 composer install 后才读取的,不是 Composer 做的。
composer install 时怎么传入 APP_ENV 这类变量
直接在命令前加变量赋值,这是最干净、最可控的方式:
-
APP_ENV=prod composer install:只对本次命令生效,不污染当前 shell - 多个变量用空格分隔:
APP_ENV=staging DB_HOST=localhost composer install - CI/CD(如 GitHub Actions)必须显式声明:
env: { APP_ENV: 'ci', CI: 'true' },不能依赖.env自动加载 - Docker 中要确保
--env APP_ENV=dev或environment: [APP_ENV=dev],写进docker-compose.yml比靠.env文件更可靠
常见错误:"post-install-cmd": "echo $APP_ENV" 输出空字符串;php -r "var_dump($_ENV['APP_ENV']);" 报 Undefined index——因为 composer install 运行时,PHP 进程根本没加载 .env,也没把 shell 变量注入进去。
哪些 composer.json 字段支持 ${VAR} 插值
不是所有字段都认 ${FOO},只有明确文档标注“支持运行时变量”的才有效。误用了也不会报错,而是静默忽略或解析失败。
- 支持插值的字段:
config.http-basic(如私有 Git 凭据)、repositories[].url(如私有 Packagist 地址)、config.process-timeout(需是纯数字字符串) - 不支持插值的字段:
config.repos、config.github-protocols、scripts里的命令字符串本身("post-install-cmd": "APP_ENV=${APP_ENV} php artisan config:clear"是错的) - 关键区别:
scripts中的变量靠 shell 层展开,不是 Composer 解析;而config下字段才是 Composer 自己处理的插值逻辑
为什么 vendor/autoload.php 里拿不到 .env 的变量
因为 vendor/autoload.php 是 Composer 自动生成的类加载器,它不执行任何环境变量加载逻辑,也不调用 vlucas/phpdotenv 这类库。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
你能在 Laravel 或 Symfony 项目里用 $_ENV['APP_ENV'],是因为它们在 public/index.php 或 bootstrap/app.php 里手动调用了 dotenv 加载——和 Composer 完全无关。
所以别指望 composer install 过程中能通过 $_ENV 拿到 .env 里的值,除非你自己在 scripts 里显式调用 PHP 脚本并加载它。
COMPOSER_HOME 和全局 PATH 配置影响环境变量可见性
改了 COMPOSER_HOME 环境变量后,如果路径写错(比如含 ~ 或 $HOME),会导致全局安装的工具(如 laravel)找不到可执行文件,进而让依赖它的脚本无法获取预期环境上下文。
-
COMPOSER_HOME必须是绝对路径,Windows 下也不能用%USERPROFILE% - 改完必须重启终端,否则旧进程仍读缓存值
- 验证方式:
composer config --list --global看 “Global configuration file” 路径是否与你设的一致 - 全局 bin 目录(如
%APPDATA%\Composer\vendor\bin)必须也加进系统PATH,否则composer global require安装的命令根本不可见
真正容易被忽略的是:变量传递链条其实是「shell → Composer → scripts → PHP 进程」,中间任一环断掉(比如没导出、没加 PATH、没加载 dotenv),APP_ENV 就会消失——它从来不是 Composer 的内置能力,只是你组合使用的副产品。

















