私有 Packagist 标记包为 abandoned 需手动配置:Satis 在 satis.json 中添加 "abandoned" 字段并重建索引;Private Packagist 通过后台点击「Deprecate package」;Toran Proxy 旧版不透传该字段,导致 --fail-on-warning 失效。

私有 Packagist 里怎么标记一个包为 abandoned
私有仓库(比如 Satis、Private Packagist、Toran Proxy)不支持像 packagist.org 那样由作者一键点「Abandon」——它没这个 UI 或 API 接口。你得手动改 composer.json 的元数据,再重新发布索引。
以 Satis 为例:在 satis.json 中,对目标包加 "abandoned": true 或 "abandoned": "new/vendor" 字段,然后运行 satis build 重新生成仓库页面和 JSON 元数据。Private Packagist 用户需登录后台,在包详情页点击「Deprecate package」并填写替代项。
- 字段必须写在包的顶层
composer.json(不是你项目的),否则 Composer 不识别 - 镜像源缓存可能延迟生效,建议清空本地 Composer 缓存:
composer clear-cache - 如果用的是自建 Git VCS 源(
"type": "vcs"),Composer 不会读取其composer.json里的abandoned字段——只认 Packagist-style 元数据源
为什么 --fail-on-warning 在私有源下经常失效
因为 Composer 的废弃警告依赖远程元数据响应体里的 "abandoned" 字段,而很多私有仓库实现不完整:Satis 默认不注入该字段;Toran Proxy 旧版压根不透传;Private Packagist 虽支持,但仅对「已 Deprecate」的包生效,对未显式操作的包仍返回空值。
结果就是:即使你在 Satis 里手动加了 "abandoned": true,composer install --fail-on-warning 也不报错——它根本没收到警告。
- 验证方式:用
curl -s https://your-satis/repo/packages.json | jq '.packages."vendor/name"[0].abandoned'看输出是否为true或字符串 - 补救办法:在 CI 中加一行校验脚本,
grep -q '"abandoned":' composer.lock比依赖安装时的 warning 更可靠 - 别依赖
composer show—— 它走的是本地 vendor 目录 + lock 文件快照,不是实时查私有源
如何让团队强制迁移到新包,而不是跳过警告
单纯靠警告没人理,得用 Composer 的约束机制卡住。最有效的是在根项目 composer.json 里写 "conflict" + "replace",让旧包无法共存。
例如旧包是 internal/logger,新包是 internal/monolog-bridge:
{
"replace": {
"internal/logger": "self.version"
},
"conflict": {
"internal/logger": "<1.5.0"
}
}
这样 composer update 会直接失败,除非你把 internal/logger 从 require 里删掉,并加上 internal/monolog-bridge。
-
replace告诉 Composer:“我这个项目自己实现了 logger 的全部接口”,避免其他包因依赖它而装不上 -
conflict是硬性拦截,版本范围越窄越精准(比如"),避免误伤还在灰度的中间版本 - 别漏掉
require-dev里的废弃包——它们同样触发冲突,但容易被忽略
私有包迁移后 autoload 失败的典型原因
不是类找不到,而是命名空间或文件路径变了。私有包常直接复制开源结构,但迁移时作者改了 autoload.psr-4 映射,比如从 "Old\Logger\": "src/" 改成 "Internal\Logging\": "src/",而你的代码还写着 use OldLoggerLogger;。
- 对比新旧包的
composer.json中autoload和autoload-dev字段,逐行检查前缀和路径 - 运行
composer dump-autoload -d vendor/internal/logger单独重建旧包映射(仅调试用),确认是否真能加载 - Laravel 用户注意:服务提供者类名、Facade 别名、配置文件键名都可能随命名空间变更,不能只改
use - 若新包用了 PHP 8.1+ 特性(如枚举、只读属性),而项目 PHP 版本低,
composer install会静默跳过 autoload 生成——先看php -v再动手
composer.lock 里的快照字段和 CI 的 grep 校验双保险。


















