composer-unused仅自动识别未使用依赖,不执行删除、不处理动态调用;删前须人工验证引用、依赖关系及运行时影响,并用composer remove+dump-autoload+install闭环清理。

不能靠“自动”二字省事——composer-unused 只负责识别,删不删、怎么删,得你拍板。它不会帮你执行 composer remove,也不会跳过动态加载、注解、配置字符串这些 PHP 天然的“黑盒调用”。所谓“自动清理”,其实是“自动识别 + 手动确认 + 命令驱动清理”的闭环。
为什么 composer-unused 扫出来一堆包,但不敢直接删?
它默认只分析 use、new、静态方法调用等 AST 可见痕迹,对以下情况无能为力:
-
class_exists('SomeClass')、interface_exists()这类运行时判断,它不解析字符串内容 - Doctrine 注解(如
@ORMEntity)或 Laravel 的@mixin,依赖反射而非显式引用 - 配置文件里写的类名字符串(如
config/logging.php中的'handler' => MonologHandlerStreamHandler::class) - 服务提供者中通过
$this->app->register()动态注册的包,代码里根本没use -
symfony/polyfill-*这类在 autoload 时就注册函数别名的包,删了会导致Call to undefined function
怎样让 composer-unused 扫得更准?
默认扫描范围太窄,容易漏报(比如测试里用了但没被扫到),也容易误报(比如 vendor/ 里的引用污染结果)。必须手动收紧边界:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 加
--exclude vendor、--exclude var、--exclude storage,避免扫描无关目录 - 测试代码要用,就得显式加
--scan-tests或把tests/加进autoload-dev的psr-4映射里 - 命令行类(如
app/Console/Commands)若没被 autoload 覆盖,也会被忽略,需补映射或加--additionalFiles - PHP 版本要匹配:PHP 7.4 项目必须用
composer-unused:^0.9.11,新版(v0.12+)只支持 ≥8.1
删之前必须人工验证的三件事
工具输出只是线索,不是判决书。每个标为“unused”的包,至少查清这三点:
- 全局搜
'VendorPackage'(单引号包裹)、"VendorPackage"、Vendor\Package,尤其看config/、routes/、app/Providers/下的 PHP 文件 - 运行
composer depends vendor/package-name,确认没有其他已安装包还依赖它;如果返回空,说明它是“孤儿”,但还得看下一条 - 删掉后跑一次
composer dump-autoload -o,再启动服务或跑单元测试——很多问题(比如Class not found)只在 autoloader 重建或运行时暴露
删完还要同步锁文件和 autoload
composer remove 只改 composer.json 和 vendor/,但可能残留 autoload 映射或 lock 文件旧记录:
- 删完立刻执行
composer dump-autoload -o,否则旧类仍可能被自动加载器找到 - 如果删的是 require-dev 包(如
phpunit/phpunit),记得加--dev参数,否则 Composer 会拒绝操作 - 删完再跑
composer install(非update),确保composer.lock和vendor/完全对齐;composer update可能重新拉回被间接依赖的包 - ThinkPHP/Laravel 等框架还需清缓存:
php think clear或php artisan config:clear
最常被忽略的一点:composer-unused 不处理 autoload.files 里手动引入的全局函数文件。如果某个包只靠 autoload.files 加载(比如 vendor/foo/bar/functions.php),而代码里又没 use 或 new,它会被标为 unused,但删了就炸——这种得翻源码确认函数是否真被调用。










