composer中如何检查未使用的依赖包_composer检测冗余依赖工具推荐【指南】

3次阅读

composer 本身不提供原生命令检测未使用依赖,因遵循声明式依赖管理哲学,不分析代码调用;推荐使用 roave/composer-dependency-analyser 进行 AST 静态分析。

composer中如何检查未使用的依赖包_composer检测冗余依赖工具推荐【指南】

Composer 本身不提供原生命令检测未使用的依赖包,必须借助第三方工具;直接运行 composer unused 或类似命令会报错——它不是 Composer 内置功能。

为什么 composer show --unused 不存在

Composer 的设计哲学是“声明式依赖管理”,只负责安装、更新和解析 composer.json 中显式声明的包,不分析代码实际调用情况。因此:
• 它不会扫描 .php 文件里的 usenewclass_exists
• 不跟踪运行时动态加载(如 class_aliasrequire_once 路径拼接)
• 无法识别测试专用依赖(如 phpunitrequire-dev 中但未被任何 *Test.php 引用)

推荐工具roave/composer-dependency-analyser

目前最稳定、维护活跃、支持 PHP 8+ 的静态分析方案。它通过 AST 解析项目全部 PHP 文件,比正则更可靠,且能区分 requirerequire-dev

  • 安装:
    composer require --dev roave/composer-dependency-analyser
  • 首次运行(生成 baseline,避免误报历史冗余):
    vendor/bin/dependency-analyser --generate-baseline
  • 日常检查:
    vendor/bin/dependency-analyser
  • 关键行为:
    • 仅报告在 composer.json 中声明、但在源码中**零引用**的包
    • 跳过 autoload-dev 下的文件(除非你手动加 --include-dev
    • 默认忽略 psr-4 映射外的类(如 tests/ 目录需显式配置)

其他可选工具及注意事项

deptracphpstan-deprecation-rules 不适用于此场景——它们专注层依赖或弃用检测,非“未使用”判断。

  • composer-unused(v0.12+):轻量,但对 trait 使用、动态类名、PHP 8.2 枚举常量引用支持不稳定,容易漏报
    • 运行前需确保 vendor/autoload.php 可正常加载(否则报 Class not found
  • 自建脚本风险高:用 grep -r "new Foo" . 类似方式会漏掉接口实现、注解、配置数组键名等间接引用
  • CI 中建议加 --fail-on-unusedroave 支持),但上线前务必人工确认——比如某包只在 dockerfile 中用于构建,代码里确实没调用,这时不应删除

真正难的不是发现冗余,而是判断“这个包到底算不算被使用”:它可能藏在配置文件里、被某段条件编译代码包裹、或只在特定扩展启用时才生效。工具只能给出线索,删之前得看上下文。

text=ZqhQzanResources