composer update --refresh未刷新到新版本,是因为它仅强制重拉本地元数据(packages.json等),若镜像站本身尚未同步新版本(如阿里云仍为v3.5.0),或项目级repositories配置覆盖全局镜像,或镜像元数据接口返回404/旧last-modified时间,则本地仍无法获取新版本。

composer update --refresh 为什么没刷新到新版本
因为 composer update --refresh 只丢弃 packages.json 和 provider-*.json,但不会清空已缓存的 ZIP 包或重建 composer.lock;如果镜像元数据本身还没同步(比如阿里云镜像上 monolog/monolog 最新 tag 是 3.5.0,但你本地 packages.json 里还只列到 3.4.2),那刷新后看到的仍是旧列表。
验证镜像是否真同步:
-
curl -I https://mirrors.aliyun.com/composer/packages.json,看Last-Modified时间是否在你期望的新版本发布之后 -
curl https://mirrors.aliyun.com/composer/p/monolog/monolog.json | jq '.packages."monolog/monolog" | keys',直接查该包所有已索引版本 - 若返回 404 或版本缺失,说明镜像延迟,不是你本地配置问题
项目 composer.json 里的 "repositories" 字段静默覆盖全局镜像
哪怕你执行了 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,只要项目根目录 composer.json 里有 "repositories" 块,Composer 就完全忽略全局设置——这是设计行为,不是 bug。
检查并清理:
- 运行
grep -A 5 '"repositories"' composer.json(Linux/macOS)或打开文件搜索"repositories" - 若存在且 URL 是已停服地址(如
https://packagist.phpcomposer.com),必须删掉整个块,不能只改 URL - 若需保留私有源,别用完整
"repositories"数组覆盖,而应单独加源:composer config repo.myprivatesource composer https://my.repo.com
config.platform 声明 ext-xxx 版本却仍报缺失
镜像源和扩展校验完全无关。报 ext-gd 缺失,只说明两件事:当前 PHP 环境没加载该扩展,且 composer.json 的 config.platform 没正确声明它。
常见错误写法(全部无效):
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"gd": "*"—— 缺少ext-前缀 -
"php-gd": "8.1"—— 命名不规范 -
"ext.gd": "8.1"—— 用了点号而非短横线
正确写法必须是:
"config": {
"platform": {
"ext-gd": "8.1.25",
"ext-mbstring": "8.1.25"
}
}
改完后必须运行 composer update --lock,否则 composer.lock 仍按旧平台信息锁定依赖。
换镜像后 dependency resolution 卡住,不是镜像的问题
卡在 Resolving dependencies 阶段,和镜像源、网络、缓存全无关系。这是 Composer 在本地穷举满足约束的版本组合,CPU 密集型计算。
典型诱因:
-
"php": "^7.4 || ^8.0"这类宽泛约束,会让求解器尝试几十种 PHP 版本与包版本交叉组合 -
"some/package": "dev-main"引用开发分支,强制拉取全量 provider 元数据(即使用了镜像) -
require-dev里同时含phpunit/phpunit、psalm/phar、phpstan/phpstan,三者约束互相撕扯
快速验证:
- 加
--profile参数跑一次:composer update --profile,看耗时是否集中在resolving而非downloading - 临时删掉
require-dev中非必要项,再试 - 已有
composer.lock?直接composer install,跳过解析阶段
真正生效的判断依据,不是配置命令是否返回成功,而是 composer require monolog/monolog --no-install -vvv 日志里出现的 Downloading https://mirrors.aliyun.com/... 或 https://repo.packagist.org/... 这一行——它才是此刻真实走的路径。缓存、项目级 repositories、环境变量 COMPOSER_REPO_PACKAGIST,三者任一出错,都会让实际请求和你预期的不一致。










