如何在不使用 I/O 的情况下获取 PMD 报告及其详细信息?

How do I get PMD reports & the details therein without using I/O?

我正在尝试使用自定义规则集生成 PMD 报告。输入是一堆字符串格式的 Apex 类。在不输出到文件的情况下,我想直接解析报告内容(XML 格式)以创建违规摘要、begin/end 行、优先级、规则名称和附加的消息。这将在 Apex 代码的多个主体上完成,每次出现违规时都会添加到报告 bean。

我试图用 SourceCodeProcessor 来做到这一点,但无法弄清楚一些必需的 objects/arguments 是什么样子,也不知道它们是如何构建的。我仍然不知道如何制作 RuleContext 对象 属性。

非常感谢任何帮助。

根据您的打算,我会采取稍微不同的方法(我是 PMD 维护者)。

SourceCodeProcessor 很低级。这是协调整个分析过程的实际位置,但错过了大部分有趣的设置。

另外请注意,SourceCodeProcessor 处理 单个文件 。对于 Apex,这目前可能没有什么不同,但 PMD 正越来越多地转向分析之间的交叉信息(即:我们计划将当前的数据流分析/控制流图代码扩展到进程间调用),因此能够让PMD control完整的项目分析就一个运行最好。

因此,我会看一看 PMD.doPmd。您可能应该编写自己的此类方法版本,但涵盖了大部分基础知识:

  1. 使用您的设置创建一个 PMDConfiguration 对象(要使用的线程、规则集等)
  2. RuleSetFacory 根据您的配置创建规则集
  3. 获取 List<DataSource> 的来源以进行分析
  4. 创建 RuleContext
  5. 设置 a listener for the report。这将允许您直接作为 POJO 获取违规(您可以避免实际生成报告文件并对其进行解析)
  6. 调用 PMD.processFiles 实际进行分析。

您应该与 PMD 目前所做的不同的一点是第 3 步。您应该围绕源代码字符串创建一个 ReaderDataSource, using a StringReader 列表,而不是指向文件 (FileDataSource)你从数据库中检索到。

你这边的代码很少,只需连接 PMD 中已有的不同部分。

P.S。这种方法的一个额外优势是,作为 PMD 非常高级别的 class PMD,它是最不可能在未来版本中进行 API 更改的。 PMD 最近采用了语义版本控制,即将发布的版本 (6.0.0) 将引入一些 API 更改/删除不推荐使用的方法和 classes.

P.S。 2:这可能不是要求这个的最佳地点......我遇到这个主要是偶然的,我认为任何不熟悉 PMD 内部结构的人都无法提供帮助。您可能希望更直接地联系 PMD 开发团队(开发邮件列表,Github,等等)。