composer install 不排除废弃包,因其仅精确还原 composer.lock 状态,不请求 packagist 元数据校验 abandoned 字段;废弃状态只在 update 时检测并写入 lock 文件,且 lock 中该字段为静态快照,不会自动刷新。

不能自动排除——composer install 本身没有跳过已弃用(abandoned)包的机制,它只按 composer.lock 安装,不管包是否被标记为废弃。
为什么 install 不拦废弃包
composer install 的职责是“精确还原 lock 文件记录的状态”,它不重新请求 Packagist 元数据,也不校验 abandoned 字段。即使某个包在 Packagist 上已被标记为 "abandoned": true,只要它还在 composer.lock 里,install 就会照常拉取安装。
- 废弃状态只在
composer update或首次解析依赖时被检测并写入 lock 文件 -
composer.lock中的"abandoned"字段是快照,不会随上游变更自动刷新 - 运行
composer install --no-dev或--optimize-autoloader等参数,也完全不影响废弃包是否被装
真正能“排除”的只有 update 阶段
想阻止废弃包进入项目,必须在 composer update 时干预,而不是 install:
- 用
"conflict"显式拦截:例如"conflict": { "old/package": "*" },让 solver 在解析阶段直接报错 - 用
"replace"欺骗 Composer:“这包我自有实现或根本不用”,它就不会再尝试安装 - 删掉所有直接 require 它的包,再跑
composer update --with-dependencies,让 solver 自动剔除传递依赖中的废弃包
注意:composer remove old/package 只有在它没被其他包硬依赖时才成功;否则得先 composer why old/package 查清来源,再逐层清理。
CI 中防止废弃包悄悄混入的实操底线
生产部署用 composer install 是对的,但 CI 流程必须前置卡点:
- 在
composer install前加一步:composer update --dry-run --fail-on-warning(Composer ≥2.5),一发现废弃警告就中断构建 - 或者跑
grep -q '"abandoned":' composer.lock && exit 1 || true,强制要求 lock 文件里不能存废弃记录 - 定期手动执行
composer update --with-dependencies并检查输出里的is abandoned行,别等上线后才发现
最易被忽略的一点:Packagist 页面右上角的「Replaced by」横幅才是唯一可信替代方案,lock 文件里那句 Use xxx instead 可能早已过时甚至指向另一个废弃包。











