composer show vendor/package-name 可查 abandoned 字段值、replaced by 替代包名及 description 中“no longer maintained”等文字,但未安装时会报错或返回空,需结合 Packagist 页面确认;abandoned: true 不保证有可用替代,replaced by 仅指接口规范,具体实现需另行选择。

composer show 能看出什么废弃信息
运行 composer show vendor/package-name 是验证弃用状态最快速的命令行方式,但它只显示部分字段,容易漏判。输出里关键要看三处:abandoned 字段是否为 true、是否有 replaced by 行、description 里是否含 “no longer maintained” 类文字。
注意:如果包没被本地安装(比如只是间接依赖),composer show 会报错或返回空——这不等于没被弃用,只是说明它不在你的 vendor/ 目录下。此时必须去 Packagist 页面查,不能凭命令结果下结论。
常见误读:abandoned: true 不代表一定有替代方案;replaced by: psr/log 是接口规范,不是可直接 require 的实现包,你还得自己选 monolog/monolog 或 php-logging/logger 这类具体实现。
为什么不能只靠 composer show 就动手换包
composer show 只告诉你“作者说它废了”,不告诉你“你项目里怎么用的它”。很多失败发生在迁移后第一行 new 或 use 就报错,原因不是包没装对,而是代码层契约断裂。
- 旧包的
autoload.psr-4映射前缀是Old\Namespace\,新包可能是New\Package\,composer dump-autoload -o后照样 Class not found -
GuzzleHttp\Client::__construct()在 v6 接收array $config,v7 改成?HandlerStack $handler,参数数量、类型、默认值全变 - 某些包(如
doctrine/cache)被替换成symfony/cache后,接口从自定义变成 PSR-6,原有->save($key, $value)调用必须重写为$pool->getItem($key)->set($value)->save()
composer depends 定位依赖源头再决定动不动手
看到 composer show 提示废弃,先别急着 remove。运行 composer depends vendor/package-name 才知道它是谁拉进来的。
输出里如果含 root,说明它在你项目的 composer.json 的 require 里直连声明,可以安全 composer remove;如果只列出一堆第三方包(如 laravel/framework、aws/aws-sdk-php),说明它是子依赖——硬删会触发依赖解析失败,composer remove 甚至可能报 “Package is not installed”。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
这时正确路径是:
→ 升级那个上游包(比如 composer update laravel/framework)
→ 查它的 CHANGELOG,确认新版是否已切换底层依赖
→ 若长期不更新,才考虑在你自己项目的 composer.json 中加 "replace": {"abandoned/package": "self.version"} + "require": {"abandoned/package": "999.999.999"} 暂时绕过,但必须同步 patch 代码调用逻辑
替换后必须验证的三个实际点
换完包、改完 use 语句、跑通 composer install,不等于迁移完成。以下三点不验,上线后大概率出问题:
• autoload 映射是否生效:执行 composer dump-autoload -o 后,手动检查 vendor/composer/autoload_psr4.php 里新包的命名空间是否被正确注册,尤其注意大小写和尾部反斜杠
• 构造函数和关键方法是否真能调用:不要只测 happy path,重点试 null 参数、空数组、异常分支——废弃包常在边界 case 里有隐藏逻辑,新包行为可能不同
• composer.lock 是否锁定预期版本:grep -A2 -B2 "new\/package" composer.lock 确认锁文件里记录的是你 require 的版本号,而不是被其他依赖拖进来的旧版;若有冲突,删 lock 文件重装更稳妥

















