composer-unused是唯一能落地的冗余依赖扫描方案,它通过反向扫描php源码中use、new等真实调用痕迹识别未使用包,而composer install、show、outdated等官方命令仅管理安装与列表,不分析代码引用。

composer-unused 是唯一能落地的扫描方案
Composer 本身不扫描 PHP 源码,composer install、composer show、composer outdated 都只管 composer.json 和 vendor/ 目录结构,完全不关心你代码里有没有 use、new、class_exists()。所以别指望官方命令能告诉你哪个包是“声明了但没用”。composer-unused 是目前唯一通过反向扫描项目 PHP 文件(查找真实调用痕迹)来识别冗余依赖的工具。
运行前必须确认 vendor 完整且路径正确
常见错误是没先跑 composer install 就执行 composer-unused,导致 autoload 映射缺失,大量类标为“未使用”——其实是找不到,不是没用。另外它默认只扫 src/,Laravel 项目主逻辑在 app/、Symfony 在 src/、自定义框架可能在 lib/ 或 core/,必须显式指定:
-
--scan-dir app(Laravel) -
--scan-dir src(Symfony) -
--scan-dir lib --scan-dir core(多目录项目)
测试文件默认跳过,若包仅在 *Test.php 中使用,需加 --include-tests;否则会被误判为冗余。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
哪些“未使用”根本不能删,得人工核对
composer-unused 是静态分析器,对运行时行为完全无感。以下三类必然误报,删了会炸:
-
symfony/polyfill-*:低版本 PHP 下被框架自动 require,代码里没use也得留 -
psr/container、psr/simple-cache:Laravel/Symfony 通过 DI 容器反射加载,源码几乎不显式引用 -
doctrine/annotations或配置驱动包(如topthink/think-queue在config/queue.php里写死'handler' => \think\queue\connector\Redis::class):工具扫不到字符串里的类名
验证方法:全局搜 'Some\Class'、"Some\Class"、class_alias、app()->bind、ServiceProvider::register,再检查 config/ 和 app/Providers/。
镜像和体积优化不是检测问题,但影响扫描结果可信度
镜像(如阿里云、腾讯云 Composer 镜像)只加速下载,不影响依赖检测逻辑。但体积膨胀会干扰判断:比如 overtrue/wechat 把 docs/、examples/ 打进 dist 包,占几十 MB,composer-unused 却无法识别这些目录是否被引用。这时要配合 --no-dev --optimize-autoloader --classmap-authoritative 清理 vendor 冗余,并用 archive.excludes 在包作者侧过滤非运行文件。真正麻烦的不是工具跑不起来,而是你得花时间区分:到底是真没用,还是调用藏在 artisan 命令、服务提供者或配置字符串里——后者根本不在静态分析视野内。










