Composer-Require-Checker 是用于检测 composer.json 中未在代码中显式引用的多余依赖的静态分析工具,通过扫描 use、new、extends 等语法比对 require 声明,支持全局安装、自定义扫描路径与忽略规则,并需结合验证步骤安全清理依赖。

Composer-Require-Checker 是一个轻量级静态分析工具,用于检测 composer.json 中声明但实际未在代码中使用的依赖(即“多余 require”)。它不运行代码,而是扫描 PHP 文件中的 use、new、extends、implements、instanceof、函数调用等语法,比对是否在 require 或 require-dev 中有对应包。正确使用能帮你精简依赖、降低安全风险和构建体积。
安装与基础运行
推荐以全局方式安装(便于多项目复用):
- 运行
composer global require maglnet/composer-require-checker - 确保
~/.composer/vendor/bin(Linux/macOS)或%USERPROFILE%\AppData\Roaming\Composer\vendor\bin(Windows)已加入系统 PATH - 进入项目根目录后执行
composer-require-checker,它会自动读取当前项目的composer.json和源码文件(默认扫描src/、lib/、tests/等常见目录)
识别“未使用依赖”的关键逻辑
该工具不会误报已加载但未直接引用的依赖(如通过插件机制、DI 容器或运行时反射加载的类),但它严格检查显式语法引用。以下情况会被标记为“未使用”:
-
monolog/monolog在composer.json中声明,但项目中没有任何use Monolog\Logger;、new Logger()、$logger instanceof Logger等用法 -
phpunit/phpunit在require-dev中,但tests/目录下没有use PHPUnit\Framework\TestCase;或调用TestCase::assertEquals()等 - 仅在注释、字符串、配置文件(如 YAML/JSON)中出现的包名,不构成有效引用
定制扫描范围与忽略规则
默认行为可能不够精准,建议创建配置文件 .composer-require-checker.json:
- 指定源码路径:
"autoload-directories": ["src", "app"] - 排除测试文件(避免把
require-dev依赖误判为未使用):"exclude-files": ["tests/**"] - 忽略已知合法但未显式引用的包(如 Laravel 的服务容器绑定、Symfony 的 Bundle 自动发现):
"ignore": ["laravel/framework", "symfony/http-kernel"] - 支持通配符:
"ignore": ["*\/psr-*"]可忽略所有 PSR 接口包(它们通常只被实现类引用,不直接 new)
清理依赖后的验证步骤
发现多余依赖后,不要直接删 composer.json —— 需验证是否真可移除:
- 先执行
composer remove vendor/package-name(Composer 2.2+ 支持),它会自动更新composer.json和composer.lock - 运行
composer install确保无缺失依赖错误 - 执行单元测试(
vendor/bin/phpunit)和静态分析(如 PHPStan)确认功能未破坏 - 特别注意:有些包虽无直接 PHP 引用,但提供命令行工具(如
php-cs-fixer)、编译扩展(如ext-memcached绑定)、或被其他已安装包间接依赖 —— 这类需结合composer show --tree查看依赖图谱再判断










