composer-dependency-analyser仅静态扫描use/new/extends/implements,无法检测class_exists()、require_once、serviceprovider注册等运行时依赖,本质是轻量级语法扫描器而非依赖图分析器。

composer-dependency-analyser 为什么查不出某些“未使用”的包
它只静态扫描 use、new、extends、implements 这几类硬编码引用,不分析运行时行为。所以以下情况它完全无视:
-
class_exists()、interface_exists()动态判断 -
require_once或include拼接路径加载的类 -
class_alias()创建的别名 - 测试专用依赖(比如
phpunit/phpunit在require-dev里,但没被任何*Test.php显式引用)
换句话说:它不是“运行时依赖图分析器”,只是个轻量级语法扫描器。别指望它发现 Laravel 的 ServiceProvider 自动注册的类,或 Symfony 的 YAML 配置驱动的服务。
怎么跑出有效结果:参数和路径必须对
默认只扫 src/ 和 tests/,如果你项目结构是 app/ + lib/,不指定路径就等于白跑。常用组合如下:
- 扫整个代码库:
vendor/bin/dependency-analyser --path=app --path=lib --path=config - 排除测试代码(避免误报 dev 包):
--exclude=tests --exclude=Tests - 强制报告所有疑似冗余项(包括 require-dev 中的):
--report-all - 生成 JSON 报告供 CI 解析:
--format=json > dep-report.json
注意:--format=html 不是内置选项,得靠第三方模板或自己导出后渲染;官方只支持 text、json、checkstyle。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
结果里标“unused”但删了就报错?先看它是否在 autoload 里
很多包看似没被代码直接引用,却通过 composer.json 的 autoload 或 autoload-dev 注入了全局符号——比如 Twig 扩展、Monolog 处理器、或自定义的 functions.php。这类包不会出现在 use 语句里,但删掉会直接导致 Class not found 或 Call to undefined function。
- 检查
composer.json里的"autoload": {"files": [...], "psr-4": {...}} - 运行
composer dump-autoload -o后再试,确认 autoloader 是否真加载了那些类 - 用
grep -r "function_name" vendor/或php --rf function_name反查来源
CI 流程里怎么安全集成
别把它当“删除清单”,而应作为“人工复核触发器”。建议流程是:
- 每天定时执行:
vendor/bin/dependency-analyser --report-all --exclude=tests --format=json > dep.json - 用脚本提取
unused列表,过滤掉已知白名单(如symfony/polyfill-*、doctrine/annotations) - 把剩余项发给负责人邮件或钉钉提醒,附上
grep -r "PackageName" src/结果 - 绝不自动
composer remove—— lock 文件一旦被改,CI 就可能因求解失败卡住
真正容易被忽略的是:这个工具本身不校验 composer.lock 一致性。它只看代码,不管依赖树是否收敛。哪怕你删掉一个“unused”包,composer update 仍可能因为其他包的约束,悄悄把它带回来。










