Composer仅在config.http-basic、repositories[].url等少数字段支持${VAR_NAME}环境变量插值,需在进程启动前通过shell导出变量,且受sudo、CI/CD、Docker等上下文隔离影响;COMPOSER_HOME须设为绝对路径并重启终端验证。

Composer 本身不读取 .env 文件,也不自动加载 shell 环境变量来控制安装逻辑——但它确实在特定字段里支持 ${VAR_NAME} 占位符,运行时由 PHP 的 getenv() 解析。所以“设置环境变量影响 composer install”,本质是:你得让变量在 Composer 进程启动那一刻就存在,且只对明确支持插值的配置项生效。
哪些配置项真正支持 ${VAR_NAME} 插值?
不是所有字段都认环境变量。只有以下几类会在运行时解析 ${...}:
-
config.http-basic(用于私有仓库认证) -
repositories[].url(比如镜像源地址) -
config.notify-on-install等少数 config 字段(文档未全列,但实测仅限白名单)
常见误区:scripts 里的命令、autoload、require 或 .env 本身都不参与此插值机制。例如你在 composer.json 里写 "url": "${MIRROR_URL}",必须确保 shell 启动 Composer 前已定义 MIRROR_URL,否则会报错或 fallback 到空字符串。
为什么 export VAR=value 后 composer install 还不生效?
因为环境变量没传进子进程,或者被权限/上下文隔离了。典型场景包括:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 用
sudo composer install:sudo 默认清空大部分环境变量,export在当前 shell 有效,但不会透传给 root 进程 - CI/CD 流水线(如 GitHub Actions):需显式在
env:块中声明,不能依赖 job 前的run: export - Docker 容器:必须用
-e VAR=value或ENV指令注入,docker exec -it ... bash -c 'export VAR=1; composer install'无效 - Windows PowerShell:
$env:VAR="value"只对当前 session 生效,新开终端或脚本调用需重新设
如何安全地在 scripts 中使用环境变量?
别指望 Composer 自己加载 .env,但你可以让 script 阶段主动读取并注入。推荐方式:
- 用
phpdotenv提前加载:在post-install-cmd里调用一个 PHP 脚本,该脚本先Dotenv::createImmutable(__DIR__)->load();,再执行后续逻辑 - Shell 层面导出后再调用:写成
"post-install-cmd": "APP_ENV=${APP_ENV:-dev} php artisan optimize",前提是APP_ENV已在 shell 中定义 - 绝对避免:直接在 script 字段里用
php -r "putenv('APP_ENV='.file_get_contents('.env'));"—— 文件路径不可靠、内容无校验、容易注入
注意:composer install 本身不会触发任何框架级环境加载;所谓“用了 APP_ENV”,其实是你项目里的 artisan 或自定义 PHP 脚本干的,不是 Composer。
COMPOSER_HOME 设错会导致全局配置“消失”
这个变量控制 Composer 全局行为的根目录,一旦设错,composer config -g 写入的内容就存到错误位置,后续 --global 操作全部失效。
- Linux/macOS 必须是绝对路径,
/home/you/.composer可以,~/.composer或$HOME/.composer会被静默忽略 - Windows 必须是完整路径,如
C:\Users\You\AppData\Roaming\Composer,不能用%APPDATA%\Composer(PowerShell 和 Git Bash 解析不一致) - 设完必须重启所有终端,验证唯一方式是运行
composer config --list --global,看第一行 “Global configuration file” 是否指向你预期路径
最常被忽略的一点:环境变量是否生效,和 Composer 版本无关,只取决于它启动时继承的 shell 上下文——检查不到变量,不是 Composer 的 bug,是你没把它送进去。

















