配置失败,因composer config -g repo.packagist输出非完整JSON即无效;必须满足键名单数、type值为composer、URL以https://开头且末尾带/,三者缺一即静默回退官方源。

composer config -g repo.packagist 输出不是完整 JSON 就算失败
执行了命令但 composer create-project 仍卡在 Downloading https://packagist.org/packages.json,说明配置根本没写进去。Composer 2.x 对键名、type 值、URL 格式三者极其敏感,错一个字符就静默 fallback 到官方源,且不报错。
-
repo.packagist必须是单数,repos.packagist或repositories.packagist全部被忽略 - 第二个参数必须显式写
composer,漏掉它,值会被当普通字符串存,不是源定义 - URL 必须以
https://开头,且末尾带/:例如https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌(少斜杠会导致路径拼成/composerpackages.json,返回 404) - 验证唯一方式:
composer config -g repo.packagist输出必须是类似{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}的完整 JSON 对象;空、null、只输出 URL 字符串,都算失败
项目级 repositories 字段会彻底屏蔽全局镜像
只要项目根目录 composer.json 里有 "repositories" 字段(哪怕只是空数组 []),Composer 就会完全忽略全局 repo.packagist 配置——不是“优先用项目级”,而是“直接不用全局”。此时即使 config -g 显示的是阿里云地址,也毫无意义。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 快速确认是否被覆盖:
composer config repo.packagist(不加-g),有输出即说明项目级生效 - 检查项目配置:
grep -A 5 '"repositories"' composer.json - 若不需要私有源,直接删掉整个
"repositories": [...]块;若需要,确保第一个是你的镜像,并显式禁用官方源:"packagist.org": false - 改完后必须运行
composer update --lock,否则composer.lock里仍是旧源地址
缓存不清理,新配置等于白配
Composer 缓存里存的是 packages.json 快照,含包列表和 dist 下载链接。换源前如果已跑过失败的 create-project,缓存里全是 packagist.org 的旧地址,新配置根本不会触发下载逻辑。
- 执行
composer clear-cache是强制步骤,不能跳过 - CI 或宝塔环境要注意:缓存路径可能挂载在 NFS 上,先查路径:
composer config --global cache-dir - 更彻底的办法:
composer install --no-cache强制跳过所有缓存 - 如果
composer.lock是旧源生成的,它里面记录的仍是packagist.org地址,此时必须加--no-cache或重生成锁文件
宝塔/CI/容器环境用户权限错位
全局配置写在 /root/.composer/config.json,但它只对 root 用户生效。而宝塔「一键部署」、PHP 管理器、Docker 容器内默认以 www 或非 root 用户运行,根本读不到 root 的配置。
- 查实际执行用户:
whoami或看日志 UID - 给
www用户配:sudo -u www composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - Docker 构建时,应在
Dockerfile中用对应用户执行(如USER www后再RUN composer config -g ...) - Windows 用户配置文件在
C:\Users\用户名\AppData\Roaming\Composer\config.json,别手写,用命令写入更安全
-vvv 日志里第一行 Downloading https://... 的域名是否是你配的镜像地址。任何环节出错——键名、type、URL 斜杠、项目级覆盖、缓存残留、用户权限——都会导致请求照旧发往 packagist.org,且不提示。

















