必须同时删除vendor和composer.lock再换源重装,因为composer.lock中硬编码的dist.sha256值源自旧镜像快照,不删除则新镜像仍按错误哈希校验,导致安装失败或包污染。

直接删掉 vendor 和 composer.lock,再换源重装——这是最可靠的做法。镜像同步滞后或校验失败时,composer install 会静默拉取损坏包,靠 composer update 或单个 require 无法修复已污染的依赖树。
为什么不能只删 vendor 重装?
因为 composer.lock 记录的是“当时镜像返回的哈希”,不是官方源的真实哈希。如果镜像同步卡在旧版本或漏同步了某次 tag,lock 文件里存的 checksum 就是错的。下次 composer install 仍会校验失败或跳过校验(取决于 COMPOSER_DISABLE_FUNCTIONS 或配置),导致问题复现。
- 国内镜像(如阿里、腾讯)偶尔出现 tag 漏同步、dist 包未及时更新、甚至 CDN 缓存脏数据
-
composer install默认信任 lock 文件里的dist.shasum,不重新比对 packagist.org 原始值 - 即使加
--ignore-platform-reqs或--no-scripts,也绕不过哈希校验环节
换源前必须清理哪些文件?
清得不干净,新源也会读错 lock 文件里的错误记录。执行以下三步:
- 删除
vendor/目录(含所有已安装包) - 删除
composer.lock(关键!否则新源仍按旧哈希拉包) - 确认
composer.json中没硬编码镜像地址(比如"repositories"里写了https://mirrors.aliyun.com/composer/却没设"packagist.org": false)
之后再运行 composer install,它会重新解析 composer.json,从当前配置的源生成全新 composer.lock。
如何验证新装的包没被镜像污染?
装完后别急着跑测试,先做两件事:
- 检查
composer.lock顶部的"content-hash"是否变化(说明 lock 已重建) - 挑一个可疑包(比如最近报
Class not found的),进入vendor/xxx/yyy,看composer.json里"time"字段是否匹配 packagist.org 上该版本发布时间 - 运行
composer show xxx/yyy,对比输出中的sourceURL 是否指向github.com或gitlab.com,而非镜像域名
如果 source 还是镜像地址,说明你没关掉 packagist.org 的代理开关——得在 composer.json 的 "repositories" 里显式禁用:{"packagist.org": false},再加镜像源。
真正麻烦的不是换源动作本身,而是 lock 文件里藏的“时间胶囊”:它把某次镜像状态固化下来,下次 install 就自动复刻那个状态。不删 lock,等于让 Composer 继续相信一个已经失效的快照。











