composer depends仅能定位废弃包的依赖来源,无法自动替换;需结合composer show、packagist页面与github文档交叉验证替代方案,并通过composer remove+composer require+conflict三步手动迁移,同时处理autoload、命名空间及配置残留。

composer depends 能查清谁在拉废弃包,但不能自动替换
它只输出依赖链,比如 composer depends guzzlehttp/ringphp 返回 aws/aws-sdk-php 3.280.0 requires guzzlehttp/ringphp (^1.0),说明你删不掉 ringphp —— 它是被 SDK 硬 require 的。这时候执行 composer remove guzzlehttp/ringphp 会直接失败,Composer 卡在依赖解析阶段,报错类似 Conclusion: don't install guzzlehttp/ringphp 1.2.0。别硬删,先看上游是否已升级:查 aws/aws-sdk-php 的 GitHub release notes,确认 v3.285+ 是否已移除对 ringphp 的依赖。
composer show 和 Packagist 页面必须交叉验证替代项
终端警告里写的 Use php-logging/logger instead 可能过时、为空,甚至指向 PSR 接口而非可安装的实现。真正权威的是三处一致:
-
composer show php-logging/logger输出里有replaced by: monolog/monolog?没有就别信 - 打开 https://www.php.cn/link/44e01f2dc15ac6f4f5455891747aedd3,右上角「Replaced by」字段是否明确写了
monolog/monolog - 去该包 GitHub 仓库,翻
README.md开头或UPGRADE.md,确认迁移路径是否包含 PHP 版本约束(比如要求 PHP ≥ 8.1)
镜像缓存会让 composer show 返回过期信息,运行前先 composer clear-cache。
replace 字段在项目根 composer.json 里完全无效
很多人在自己项目的 composer.json 里加:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
"replace": { "old-vendor/old-package": "*" }
这不会让 Composer 自动用新包替代旧包,也不会阻止旧包被拉入 vendor。它只在“你发布一个包给别人用”时才有意义。在你自己项目里写这个,等于没写。真要绕过冲突,得用组合策略:
- 删掉旧包:
composer remove old-vendor/old-package - 显式 require 新包:
composer require new-vendor/new-package:^4.0 - 加 conflict 阻止残留:
"conflict": { "old-vendor/old-package": "*" }
否则下次 composer update 可能悄悄把旧包又拉回来。
autoload 和类名断裂比依赖解析失败更难排查
很多废弃包的替代者改了命名空间、构造参数或方法签名,composer dump-autoload -o 后仍会报 Class not found 或 Too few arguments。必须手动处理:
- 查新包的
composer.json中autoload段,确认是否映射到原命名空间;若不是,全局搜use OldVendor并替换成新前缀 - 检查配置文件里有没有硬编码的类名字符串,比如 Laravel 的
config/logging.php里写的'handler' => OldVendorLogger::class - 运行
phpstan analyse --level=7扫描所有new OldVendor和class_exists('OldVendor\')调用点
最常被忽略的是 autoload-dev 里的测试类引用——旧版 phpunit/phpunit-mock-objects 废弃后,vendor/bin/phpunit 可能直接退出,因为 PHPUnit_Framework_TestCase 已不存在。










