Deptrac 不依赖 Composer 运行,但必须正确读取 composer.json 的 autoload 配置且 vendor/autoload.php 存在并可加载,否则类无法识别、规则失效;autoload 路径须为静态字符串、语法必须合法,paths 与 autoload 需对齐,dev 类需启用 include_dev_dependencies。

Deptrac 本身不依赖 Composer 运行,但你在项目中用它检查架构约束时,deptrac 命令必须能正确读取 composer.json 中的 autoload 配置,否则它根本找不到你的类——不是报错,而是静默跳过。
Deptrac 启动前必须确保 vendor/autoload.php 存在
Deptrac 不会自动执行 composer dump-autoload 或 composer install。它只尝试 require 当前目录下的 vendor/autoload.php。如果这个文件不存在(比如刚克隆项目还没装依赖),deptrac analyse 会失败或漏扫大量文件。
- 运行
composer install或至少composer dump-autoload,确保vendor/autoload.php已生成 - 检查
vendor/autoload.php是否可读:php -f vendor/autoload.php不应报错 - 若用 Docker 或 CI 环境,确保构建阶段已执行依赖安装,不能只拷贝
composer.json
composer.json 的 autoload 配置必须真实、路径无误
Deptrac 解析 composer.json 是纯 JSON 读取,不执行 PHP 代码。任何动态路径(如环境变量、拼接字符串)或语法错误都会导致命名空间映射失效,进而让 deptrac 无法识别类所属层。
- ✅ 正确示例:
"App\": "src/"—— 路径是相对项目根目录的静态字符串 - ❌ 错误示例:
"App\": "${SRC_DIR}/"或"App\": "src//"—— Deptrac 解析失败,.*Controller.*收集器匹配不到任何类 - 若使用
classmap或files类型 autoload,需确认vendor/composer/autoload_classmap.php已生成(即已运行过dump-autoload)
deptrac.yaml 中的 paths 和 autoload 必须对齐
paths 只控制扫描范围,不解决类加载问题。即使你把 ./src 加进 paths,如果 composer.json 里没注册 App → src/ 的映射,Deptrac 仍认为这些文件“不属于任何命名空间”,收集器规则(如 .*Controller.*)完全不生效。
-
paths应包含所有你想分析的源码目录(如./src,./tests) - 但每个目录下的类,其命名空间必须在
composer.json的autoload或autoload-dev中有明确声明 - 测试类若在
autoload-dev下,需在deptrac.yaml中显式设置include_dev_dependencies: true,否则./tests下的类不会被解析
常见报错和对应排查点
遇到 Class not found 或扫描结果为空,别急着改 deptrac.yaml,先看底层加载是否通:
-
Cannot open vendor/autoload.php→ 检查是否运行过composer install - 规则没命中(如
.*Controller.*一条都不匹配)→ 用composer dump-autoload --no-scripts && php -r "print_r(require 'vendor/autoload.php');"确认类映射是否写入autoload_static.php - 扫描结果里只有 vendor 下的类,没有 src/ →
composer.json的autoload.psr-4键名末尾少了反斜杠,比如写成"App": "src/"而非"App\": "src/"
最易被忽略的是:Deptrac 不验证 composer.json 语法是否合法,它只是读取 JSON。一个多余的逗号、引号不闭合,会导致整个 autoload 字段被忽略,而错误日志里往往没有任何提示。











