composer_home必须设为绝对路径,否则静默失效;composer启动时优先读取该变量,设则使用、不设则回退默认路径,且不校验路径存在性或自动创建目录,路径含~、$home或%userprofile%均导致auth.json丢失、全局命令失效。

COMPOSER_HOME 必须设为绝对路径,否则静默失效
Composer 启动时第一件事就是读 COMPOSER_HOME 环境变量,设了就用它,没设才 fallback 到默认路径(~/.composer 或 %APPDATA%\Roaming\Composer)。但它不校验路径是否存在,也不自动创建目录或迁移旧配置——路径错一个字符、含 ~ 或 $HOME、Windows 用 %USERPROFILE%,都会导致 auth.json 找不到、全局包命令失效、甚至 composer self-update 报错。
- Linux/macOS:写入
~/.zshrc(Zsh)或~/.bashrc(Bash),内容为export COMPOSER_HOME="/opt/my-composer",然后source ~/.zshrc - Windows(PowerShell):
[Environment]::SetEnvironmentVariable("COMPOSER_HOME", "D:\my-composer", "User"),重启终端 - 验证是否生效:
composer config --global home输出必须和你设的完全一致 - 手动建目录:
mkdir -p $COMPOSER_HOME(Linux/macOS)或mkdir D:\my-composer(Windows) - 把原
~/.composer/auth.json拷过去,并设权限:chmod 600 $COMPOSER_HOME/auth.json
config.http-basic 和 repositories[].url 支持 ${VAR} 插值,其他字段不支持
Composer 只在明确文档标注“支持变量插值”的字段里解析 ${VAR_NAME},靠 getenv() 运行时展开。不是所有字段都认——比如 config.repos、config.github-protocols 就不支持,但下面这些可以:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
config.http-basic:值写成{"gitlab.example.com": {"username": "${GIT_USER}", "password": "${GIT_TOKEN}"}} -
repositories[].url:如"${PRIVATE_PACKAGIST_URL}" -
config.process-timeout、config.notify-batch等数值型配置,也接受变量(值必须是纯数字字符串) - 变量未定义时,Composer 默认忽略该字段,不报错,容易静默失败——建议 CI 脚本里加
echo $GIT_TOKEN | wc -c类检查 -
.env文件完全无效:vendor/autoload.php 不加载它,autoload.files里加 dotenv 会引发循环依赖
临时覆盖只对单条命令有效,别指望它影响全局行为
用 COMPOSER_HOME=/tmp/composer-test composer install 这种方式,只改当前这一条命令的主目录;它不会改变 composer global require 的安装位置,也不会让 vendor/bin 下的命令自动进 PATH。常见误用场景:
- Docker 构建中漏设环境变量:
docker run -e COMPOSER_HOME=/app/composer …必须显式传入,镜像内默认不继承宿主机变量 - GitHub Actions 中必须用
env:块注入,不能靠.env或with:传参 -
COMPOSER_VENDOR_DIR=lib composer install只改 vendor 目录名,但require 'vendor/autoload.php'仍要手动改成require 'lib/autoload.php' - 临时设置无法让
composer global命令生效——全局 bin 目录($COMPOSER_HOME/vendor/bin)还是按COMPOSER_HOME当前值走
PATH 配置不到位,global 命令永远找不到
改了 COMPOSER_HOME 后,composer global require laravel/installer 会把 laravel 放进 $COMPOSER_HOME/vendor/bin/,但这目录不在系统 PATH 里,敲 laravel 肯定报 command not found。
- Linux/macOS:在
~/.zshrc末尾加export PATH="$COMPOSER_HOME/vendor/bin:$PATH",注意别用~/.composer/vendor/bin(旧路径) - Windows:把
%APPDATA%\Composer\vendor\bin或你设的%COMPOSER_HOME%\vendor\bin加进系统环境变量Path(不是用户变量) - 改完必须新开终端,
echo $PATH或echo %PATH%确认包含该路径 - IDE 内置终端可能不读 shell 配置文件,需在 IDE 设置里指定 shell 启动方式(如 VS Code 的
terminal.integrated.defaultProfile.linux)
getenv();后续脚本、autoload、框架逻辑全不参与。最容易被忽略的是变量注入时机:shell export、CI env 块、Docker --env、systemd Environment=,四者生效机制完全不同。










