如何在不使用 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
。您可能应该编写自己的此类方法版本,但涵盖了大部分基础知识:
- 使用您的设置创建一个
PMDConfiguration
对象(要使用的线程、规则集等)
- 让
RuleSetFacory
根据您的配置创建规则集
- 获取
List<DataSource>
的来源以进行分析
- 创建
RuleContext
- 设置 a listener for the report。这将允许您直接作为 POJO 获取违规(您可以避免实际生成报告文件并对其进行解析)
- 调用
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,等等)。
我正在尝试使用自定义规则集生成 PMD 报告。输入是一堆字符串格式的 Apex 类。在不输出到文件的情况下,我想直接解析报告内容(XML 格式)以创建违规摘要、begin/end 行、优先级、规则名称和附加的消息。这将在 Apex 代码的多个主体上完成,每次出现违规时都会添加到报告 bean。
我试图用 SourceCodeProcessor 来做到这一点,但无法弄清楚一些必需的 objects/arguments 是什么样子,也不知道它们是如何构建的。我仍然不知道如何制作 RuleContext 对象 属性。
非常感谢任何帮助。
根据您的打算,我会采取稍微不同的方法(我是 PMD 维护者)。
SourceCodeProcessor
很低级。这是协调整个分析过程的实际位置,但错过了大部分有趣的设置。
另外请注意,SourceCodeProcessor
处理 单个文件 。对于 Apex,这目前可能没有什么不同,但 PMD 正越来越多地转向分析之间的交叉信息(即:我们计划将当前的数据流分析/控制流图代码扩展到进程间调用),因此能够让PMD control完整的项目分析就一个运行最好。
因此,我会看一看 PMD.doPmd
。您可能应该编写自己的此类方法版本,但涵盖了大部分基础知识:
- 使用您的设置创建一个
PMDConfiguration
对象(要使用的线程、规则集等) - 让
RuleSetFacory
根据您的配置创建规则集 - 获取
List<DataSource>
的来源以进行分析 - 创建
RuleContext
- 设置 a listener for the report。这将允许您直接作为 POJO 获取违规(您可以避免实际生成报告文件并对其进行解析)
- 调用
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,等等)。