composer仅在文档明确支持的字段(如config.http-basic、repositories[].url等)中通过${var_name}调用getenv()解析环境变量,且变量须在php进程启动前存在;config.repos等字段不支持插值,静默忽略;ci/docker/sudo等场景需显式传递变量,否则失效。

Composer 本身不加载 .env 文件,也不主动读取系统环境变量来控制流程;它只在少数明确支持的配置字段中,用 ${VAR_NAME} 占位符调用 PHP 的 getenv() 解析——前提是变量已在 PHP 进程启动前就存在。
哪些 composer.json 字段真正支持 ${VAR_NAME} 变量插值
不是所有字段都认环境变量。只有文档明确标注「支持变量插值」的才生效,常见可用项包括:
-
config.http-basic:比如{"private.example.com": {"username": "${GIT_USER}", "password": "${GIT_TOKEN}"}} -
repositories[].url:如"${PRIVATE_REPO_URL}" -
config.process-timeout、config.notify-batch等数值型配置(值必须是数字字符串)
容易踩坑的是:config.repos、config.github-protocols、autoload、scripts 等字段**完全不支持**插值,写了也白写,且不会报错,属于静默忽略。
为什么 export 后本地能用,CI 或 Docker 里就失效
根本原因是变量没传进 Composer 启动时的 PHP 进程上下文。常见断点:
- CI(GitHub Actions / GitLab CI):不能靠
.env自动加载,必须显式写env:块,例如GIT_TOKEN: ${{ secrets.GIT_TOKEN }} - Docker:用
ENV GIT_TOKEN=xxx(Dockerfile)或--env GIT_TOKEN=xxx(run 时),docker-compose.yml中的environment:也要写全,不能只写 key - sudo / systemd 启动:默认丢弃大部分用户环境变量,需用
sudo -E或在 service 文件里加Environment=GIT_TOKEN=xxx
验证是否生效:在 composer install 前加一行 php -r "var_dump(getenv('GIT_TOKEN'));",输出 bool(false) 就说明没传进去。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
scripts 里想用 APP_ENV?别指望 .env,得靠 shell 层导出
composer.json 的 scripts 是直接由 shell 执行的命令,它继承的是启动 Composer 的那个 shell 的环境,和项目根目录下 .env 毫无关系。
- 错误做法:
"post-install-cmd": "echo $APP_ENV"—— 若没提前export APP_ENV=prod,一定为空 - 正确做法:在运行
composer install前执行APP_ENV=prod composer install,或在 CI 脚本中先export APP_ENV=staging - 绝对别在 scripts 里硬写
php -r "putenv(...)"加载.env—— 安全风险高、路径易错、且putenv()对子进程不一定传递
真正该加载 .env 的地方,是你的应用入口(如 index.php 或 artisan),不是 Composer 阶段。
COMPOSER_HOME 和全局 bin 路径不是环境变量,但常被混淆
COMPOSER_HOME 是一个特殊环境变量,但它控制的是 Composer 自身的配置/缓存/全局包存放路径,不是用来给 composer.json 插值的。
- 它必须是**绝对路径**,不能含
~或$HOME,设完要重启终端 - 全局安装的命令(如
laravel)实际放在$COMPOSER_HOME/vendor/bin/,这个目录必须手动加进系统PATH才能直接调用 -
composer config --global http-basic...设置的是认证凭据,不是运行时环境变量;它写入$COMPOSER_HOME/config.json,对所有项目生效,但仅限于支持全局配置的字段
最易忽略的一点:变量未定义时,Composer 不报错,而是直接跳过对应字段——这意味着私仓认证失败、镜像地址为空,你可能直到 Could not find package 才意识到变量根本没传进来。










