包作者删库后镜像失效,因镜像仅缓存元数据不存源码;真正保命的是composer.lock+本地缓存+repositories显式兜底,四者缺一不可但须按序依赖。

包作者删库后,镜像再快也没用——它只缓存元数据,不存源码;真正能救命的是 composer.lock + 本地缓存 + repositories 显式兜底。
为什么“支持快照的镜像”是个误导概念
所谓“快照镜像”,常被误认为能永久保留所有历史包。实际上,所有主流 Composer 镜像(阿里云、华为云、USTC)都只同步 packages.json 和各包的 /p/vendor/name.json 元数据,**不保存 dist.zip 或 git commit 内容本身**。一旦作者从 GitHub/GitLab 删了仓库,或从 Packagist 删除包条目,镜像的元数据也会在几小时到一天内同步消失——你看到的“404 Not Found”不是网络问题,是源头已空。
关键点:composer.lock 里若还存着该包的 dist.url(比如指向 GitHub zipball 的 HTTPS 链接),且那个链接仍可访问,那你就还有救;如果连 dist.url 都是空的或已返回 404,镜像再全也拉不出东西。
删库后还能装上的三个实操条件
必须同时满足以下三点,composer install 才可能成功:
- 你的
composer.lock文件存在,且该包的dist字段含有效url和shasum - 那个
dist.url当前仍可直接curl -I返回 200(常见于 GitHub 未删 repo,只是作者弃更) - 你没手动清过
~/.composer/cache/files/——Composer 会优先复用本地已校验过的 zip 包,完全不走网络
验证方式:运行 composer install --no-cache -vvv,观察日志中是否出现 Downloading https://...zip;若跳过下载、直接 Extracting...,说明缓存命中,这是最稳的状态。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
repositories 配置怎么写才真正兜底
当 dist.url 已失效,但你知道源码还在某个公开地址(如 GitHub 存档页、GitLab fork、甚至你自己备份的 zip),就得用 repositories 强制接管。重点不是“加个镜像”,而是把包声明为私有包:
在 composer.json 顶层加:
{
"repositories": [
{
"type": "package",
"package": {
"name": "monolog/monolog",
"version": "1.15.0",
"dist": {
"url": "https://github.com/your-fork/monolog/archive/v1.15.0.zip",
"type": "zip",
"shasum": "a1b2c3..."
},
"autoload": {
"psr-4": { "Monolog\": "src/" }
}
}
}
]
}
注意:type: "package" 是硬性要求,不能写成 "composer";version 必须和 composer.lock 里记录的完全一致;shasum 必须手算(sha1sum xxx.zip),错一位就校验失败。
最容易被忽略的保命动作
不是换镜像,也不是升级 Composer,而是两件事:
- 每次
composer update后,立刻执行composer archive vendor --format=zip --filename=deps-$(date +%Y%m%d).zip,把当前vendor/打包存档——它比任何镜像都真实 - CI 流水线中,必须挂载并复用
~/.composer/cache目录,否则每次都是裸机重下,删库即崩
镜像只是加速器,composer.lock 是契约,本地缓存是保险柜,repositories 是应急通道——四者缺一不可,但顺序不能乱:先有 lock,再靠缓存,最后才轮到兜底配置。










