COMPOSER_HOME环境变量唯一决定Composer实际全局路径,config --global home仅写配置文件,不生效;必须设绝对路径并加入PATH,且重启终端验证echo $COMPOSER_HOME与composer config --global home一致。

composer config --global home 输出的是配置值,不是运行时路径
执行 composer config --global home 只会读取全局配置文件 config.json 中的 home 字段,它可能和 Composer 实际使用的路径不一致。真正起作用的是 COMPOSER_HOME 环境变量——只要这个变量被设置了,Composer 就完全忽略配置文件里的 home 值。
常见误判场景:
- 你运行过
composer config --global home /new/path,但没设环境变量,结果composer global require仍往旧目录装包 -
composer config --global --list显示home是新路径,但echo $COMPOSER_HOME(Linux/macOS)或echo %COMPOSER_HOME%(Windows)输出为空或旧路径
Linux/macOS 下验证真实路径的三步法
别只信 config 命令,用系统级方式交叉验证:
- 运行
echo $COMPOSER_HOME—— 这是 Composer 启动时实际读取的根路径 - 运行
composer config --global home—— 对比是否与上一条一致 - 运行
ls -d $COMPOSER_HOME/vendor 2>/dev/null || echo "路径不存在"—— 看该目录是否真实可访问
如果三者不统一,说明环境变量未生效(比如没写进 ~/.zshrc 或没 source),或者配置项写错了位置。
Windows 上必须区分 CMD 和 PowerShell 的变量读法
在 Windows 中,COMPOSER_HOME 是否生效取决于你用什么终端启动 Composer:
- CMD:用
echo %COMPOSER_HOME%查看,设置需用setx COMPOSER_HOME "D:\my-composer" - PowerShell:用
echo $env:COMPOSER_HOME,设置需用[Environment]::SetEnvironmentVariable("COMPOSER_HOME", "D:\my-composer", "User") - Git Bash:它不自动继承 Windows 环境变量,得在
~/.bashrc里显式export COMPOSER_HOME="/c/Users/xxx/AppData/Roaming/Composer"
特别注意:修改后必须新开终端窗口,旧窗口不会重载环境变量。
bin-dir 和 vendor-dir 的路径不能靠猜
即使你知道了 COMPOSER_HOME,全局命令(如 laravel)也不一定在 $COMPOSER_HOME/vendor/bin。新版 Composer(2.4+)默认把 bin-dir 指向 $COMPOSER_HOME/vendor/bin,但这个值可以被单独覆盖:
- 查真实
bin-dir:运行composer global config bin-dir --absolute - 查真实
vendor-dir:运行composer global config vendor-dir(注意没有--absolute) - 这两个路径可能和
COMPOSER_HOME不在同一层级,尤其是当vendor-dir被设为相对路径(如vendor)时,它会被拼接到COMPOSER_HOME下;但如果设为绝对路径(如/opt/composer-vendor),就完全脱离COMPOSER_HOME
最容易被忽略的一点:改了 bin-dir 后,你必须手动把新路径加进系统 PATH,否则 which laravel 依然找不到。











