Composer全局配置需确认COMPOSER_HOME路径(执行composer config --global --list查看),并区分真正全局生效项(如github-oauth)、仅兜底项(如minimum-stability)及无效项(如autoload);镜像源键名、协议、格式须严格正确,改后需clear-cache。

全局配置不是“设一次就管所有项目”,而是必须明确哪些键真正跨项目生效、哪些会被项目级 composer.json 直接覆盖——漏掉 --global 或选错键名,改了也白改。
怎么确认 config --global 写对了位置
执行 composer config --global --list,第一行会显示实际读取的配置文件路径。这个路径由 $COMPOSER_HOME 环境变量决定,而非固定为 ~/.composer/config.json 或 %APPDATA%\Composer\config.json。常见问题包括:
- Linux/macOS 用户设了
export COMPOSER_HOME="$HOME/composer",但没重启终端,composer config --global仍写进旧路径 - Windows 用户在 PowerShell 中直接写
$env:APPDATA,结果被当作字符串字面量,路径拼接失败 - 用
sudo composer config --global,导致配置写进 root 用户目录,普通用户执行时完全读不到
哪些 config 键真正全局生效,哪些只是“看起来像”
Composer 对不同键的处理逻辑完全不同,不能凭名字猜测作用域:
- 真正稳定全局生效(项目无法覆盖):
github-oauth、http-basic、cache-dir、process-timeout、secure-http - 看似全局、实则只在无
composer.json时兜底:minimum-stability、prefer-stable、platform—— 一旦当前目录有composer.json,它们立刻被忽略 - 完全无效(设了也静默丢弃):
autoload、require、scripts—— 这些根本不在全局配置支持范围内
验证方法:在空目录下运行 composer require monolog/monolog,看是否按你设的 minimum-stability 行为拉包;再进一个已有 composer.json 的项目,运行 composer config --list,对比同名键是否消失或被替换。
镜像源和认证类配置最容易踩的坑
换国内镜像或配私有仓库时,键名、协议、格式稍错一点,后续所有 install 都会卡住或报 401,但错误提示极不明确:
- 镜像键名必须是
repo.packagist(旧版)或repos.packagist(新版),不是repository或packagist -
https://前缀不能省,Composer 2.2+ 默认禁用http://源,少写会直接拒绝连接 -
http-basic要拆成完整三段:composer config --global http-basic.repo.example.com username password,中间不能有空格或引号干扰 - GitHub Token 必须用
github-oauth.github.com,不是github.com或api.github.com
改完建议立刻跑 composer clear-cache,否则旧缓存会让镜像切换“看起来没生效”。
为什么 global require 的命令找不到
composer global require laravel/installer 只是把二进制文件放进 $COMPOSER_HOME/vendor/bin/,它不会自动加进系统 PATH。这是最常被跳过的一步,也是唯一导致 command not found 的原因:
- Linux/macOS:在
~/.zshrc或~/.bashrc末尾加export PATH="$COMPOSER_HOME/vendor/bin:$PATH",然后source ~/.zshrc - Windows:把
%APPDATA%\Composer\vendor\bin(或你自定义的$COMPOSER_HOME\vendor\bin)加进系统环境变量PATH - 验证:新开终端,运行
echo $PATH(macOS/Linux)或echo %PATH%(Windows),确认路径已包含
真正容易被忽略的是:COMPOSER_HOME 被覆盖后,vendor/bin 路径就变了,但很多人只记得加默认路径,忘了同步更新 PATH。











