Composer不管理环境变量,真正加载.env的是PHP代码中调用vlucas/phpdotenv的createImmutable()->load();需在入口文件顶部引入autoload并立即加载,之后才可用$_ENV或getenv()读取。

Composer 本身不设置、不读取、也不传递项目级环境变量——它不是环境管理工具。你看到的“项目级环境变量”实际由 PHP 运行时(比如通过 vlucas/phpdotenv)加载,而 Composer 只负责帮你装这个库、并在合适时机触发加载逻辑。
为什么 composer install 不自动读 .env
因为 composer install 是一个纯依赖安装命令:它解析 composer.json、下载包、生成 vendor/autoload.php、执行 scripts——但不会执行任何 PHP 代码里的 $_ENV 或 getenv()。所以即使你有 .env 文件,composer install 也完全感知不到。
- 常见错误现象:
"post-install-cmd": "echo $APP_ENV"输出空字符串;php -r "var_dump($_ENV['APP_ENV']);"报Undefined index - 真正读
.env的是你的应用入口(如index.php或artisan),前提是它调用了Dotenv::createImmutable() -
composer.json中的scripts是 shell 命令,变量需由 shell 层展开,不是 Composer 解析的
怎么让项目启动时自动加载 .env
核心是引入并初始化 vlucas/phpdotenv,不是配置 Composer 本身。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行
composer require vlucas/phpdotenv,它会被自动加入vendor/autoload.php - 在项目入口文件(如
public/index.php或bootstrap/app.php)中添加:
require_once __DIR__.'/../vendor/autoload.php'; $dotenv = Dotenv\Dotenv::createImmutable(__DIR__.'/..'); $dotenv->load();
-
.env必须放在项目根目录,且不能提交到 Git(加进.gitignore) - 提供
.env.example并用post-install-cmd自动复制(可选):
"scripts": {
"post-install-cmd": [
"php -r \"file_exists('.env') || copy('.env.example', '.env');\""
]
}
哪些 composer.json 字段支持 ${VAR} 插值
只有少数字段明确支持运行时变量插值,且必须由 shell 层提前导出,不是 Composer 自己读 .env。
- 支持插值的字段:
config.http-basic、repositories[].url、config.process-timeout - 示例:
"config": {"http-basic": {"private.example.com": {"username": "${GIT_USERNAME}", "password": "${GIT_TOKEN}"}}} - 不支持插值的字段:
scripts内容、config.repos、minimum-stability—— 写了也无效,甚至导致静默失败 - 想在 scripts 中用变量?必须外部传入:
GIT_TOKEN=abc123 composer install,再在 script 里用$GIT_TOKEN(shell 展开)
CI/CD 和 Docker 中怎么安全传环境变量
别依赖本地 .env 文件,它不该进版本库,也不该出现在构建镜像里。
- GitHub Actions:
env:块显式声明,composer install前变量已注入 shell - Docker:
docker run --env APP_ENV=prod ...或docker-compose.yml中用environment:列表,而非env_file: - GitLab CI:
variables:下定义,确保composer install在同一 job 中执行 - 关键原则:环境变量应在容器或 runner 启动时注入,而不是靠
cp .env.example .env这类操作
最容易被忽略的一点:所有对 $_ENV 或 getenv() 的访问,都发生在 PHP 脚本执行阶段,和 Composer 完全解耦。把环境变量加载逻辑塞进 Composer 脚本里,本质是混淆了构建时与运行时边界——这会让本地开发、CI、Docker 多环境行为不一致。

















