composer config -g -l 输出的是 Composer 合并后真实生效的全局配置,自动跳过非法 JSON、权限错误或路径无效等静默失效项;加 --verbose 可确认实际加载的配置文件路径。

composer config -g -l 输出才是真实生效配置
格式没错 ≠ 配置有效。运行 composer config -g -l 看到的,才是 Composer 实际合并后启用的全局配置。它自动跳过非法 JSON、权限错误、路径不存在等导致的静默失效项。如果你手动改了 ~/.composer/config.json 却没反应,大概率是文件里多了中文逗号、用了全角引号,或写到了被 COMPOSER_HOME 覆盖的另一个位置。
加 --verbose 才能确认实际读取的是哪个文件
只看 composer config -g -l 不知道配置从哪来,容易误判。必须加 --verbose:
composer config -g -l --verbose
输出第一行会明确显示 Loaded config file: /home/xxx/.config/composer/config.json(Linux/macOS)或 Loaded config file: C:\Users\xxx\AppData\Roaming\Composer\config.json(Windows)。这个路径就是你真正该改的地方。常见坑包括:
- 用
sudo composer config -g,结果写进了/root/.composer/config.json,但日常用户根本读不到 - PowerShell 里
%APPDATA%没展开,Composer 直接跳过配置文件 - Git Bash 或 WSL 中
COMPOSER_HOME被分别设置,两边配置不一致
验证镜像源是否真在用新地址
改完 repo.packagist 后,别只信配置项,要看实际请求 URL:
composer config -g repo.packagist —— 输出必须是完整 JSON 对象,比如 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"};空值或报错说明仍走官方源
再执行一次带调试的命令:
composer -vvv require monolog/monolog
日志里出现的 GET https://mirrors.aliyun.com/composer/packages.json 才是真实发出的请求。如果还是 packagist.org,立刻清缓存:composer clear-cache —— 这步漏掉,90% 的“配置不生效”问题就卡在这。
global require 命令不生效?先查 bin-dir 和 PATH
即使 composer global require laravel/installer 成功,终端也找不到 laravel 命令,问题往往不在配置本身,而在执行环境:
- 运行
composer global config bin-dir,确认输出路径(如/home/xxx/.composer/vendor/bin) - 检查该路径是否已加入
PATH:运行echo $PATH(Linux/macOS)或echo %PATH%(Windows) - 如果没加,临时测试可直接调用:
/home/xxx/.composer/vendor/bin/laravel new test - 永久生效需在 shell 配置文件(
~/.bashrc、~/.zshrc或 Windows 系统环境变量)中追加该路径
最易忽略的一点:配置生效和命令可用是两件事——repo.packagist 写对了,bin-dir 也对,但 PATH 没设,照样执行不了 global 安装的命令。











