Composer仅对config.http-basic、repositories[].url等明确支持插值的字段解析${VAR_NAME},name、version等字段不支持;变量未定义时静默忽略,不报错。

composer.json 里 ${VAR} 不展开?检查字段是否支持插值
Composer 只对明确文档标注「支持变量插值」的字段解析 ${VAR_NAME},不是所有配置项都行。常见能用的有:config.http-basic、repositories[].url、config.process-timeout;但 config.repos、config.github-protocols、name、version 等字段完全不支持——写进去也当普通字符串处理。
容易踩的坑:
- 误以为
composer.json是模板引擎,直接写"name": "org/${PACKAGE_NAME}"→ 解析失败,JSON 格式错误或静默忽略 - 变量未定义时 Composer 默认跳过该字段(不报错),导致私仓认证失效、URL 回退到 packagist.org 却毫无提示
- 字段值必须是字符串类型才能插值;数值型配置如
process-timeout要确保环境变量值是纯数字字符串(如"300"),不能带空格或单位
本地能用,CI/容器里就失效?环境变量没传进 PHP 进程
getenv() 只读取当前 PHP 进程启动时继承的 shell 环境变量。你在本地 export GIT_TOKEN=xxx 后运行 composer install 能生效,是因为终端进程把变量传给了子进程;但在 CI 或容器中,这个链路常被切断。
实操建议:
- GitHub Actions:必须在
env:块显式注入,不能靠.env文件或dotenv加载 - Docker:用
--env GIT_TOKEN=xxx或docker-compose.yml的environment:字段,ENV指令只影响构建阶段,不影响运行时 - systemd 或 sudo:用
sudo -E保留环境,或在 service 文件里用Environment=GIT_TOKEN=xxx - 避免在
composer.json的scripts中依赖$APP_ENV—— script 是 shell 命令,但它的环境变量继承自执行 composer 的上下文,不是项目.env
为什么 vendor/autoload.php 里读不到 .env 变量?时机根本不对
vendor/autoload.php 是 Composer 安装完成后生成的类加载器,它只管 classmap、psr-4 映射,**不负责加载任何环境变量**。有人试图在 autoload.files 里 require dotenv,这会导致两个硬伤:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 项目还没装
vlucas/phpdotenv时,composer install就会因找不到文件而失败(循环依赖) - 即使装了,
autoload.files是 Composer 执行完才加载的,对composer.json里的${GIT_TOKEN}插值毫无作用——那个插值发生在 Composer 启动 PHP 进程的最初几毫秒
真正起效的时机只有:PHP 进程刚启动、Composer 开始读配置前。所以要么提前用 shell export,要么用 php.ini 的 auto_prepend_file 调用 putenv(),或者让 CI/CD 平台直接注入。
COMPOSER_HOME 设错或 PATH 没配?全局命令和配置全乱套
如果 composer global require laravel/installer 成功,但 laravel 命令报 command not found,大概率是 COMPOSER_HOME 和系统 PATH 没对上。
关键点:
-
COMPOSER_HOME必须是绝对路径,不能含~、$HOME、%USERPROFILE%—— Windows 下设成%APPDATA%\Composer会直接失效 - 全局 bin 目录(如
~/.composer/vendor/bin)必须手动加进系统PATH,否则 shell 找不到命令;Linux/macOS 改完要source ~/.zshrc,Windows 必须新开终端 - 运行
composer config --list --global看顶部 “Global configuration file” 路径是否与你预期一致,这是唯一可信验证方式 - 别混淆
composer config --global和运行时环境变量——前者控制镜像源、超时等行为,后者才影响${VAR}插值
最常被忽略的是:变量未定义时 Composer 不报错,而是静默跳过对应配置项。这意味着私仓认证失败、仓库 URL 回退、甚至整个 repositories 段消失,都可能悄无声息地发生。调试时优先检查 getenv('YOUR_VAR') 是否返回预期值,而不是只盯着 composer install 的输出。

















