PMD 的功能
PMD (Programming Mistake Detector) 是一个开源的静态代码检查工具。
静态代码检查就是在不运行代码的情况下检查代码中的内容,然后和事先制定的规则进行比对,指出代码中不符合规则的部分。
PMD 工具可以在以下方面对项目的开发过程进行帮助:
- 在开发阶段,让开发者通过自我检测发现代码中的错误,及时修改
- 在审查阶段,减轻人工 pull request 审查的工作量
- 通过制定规则(或使用已有的规则),统一项目的代码规范,提高代码质量
- 新成员可以快速熟悉项目的规范,缩短融入团队的时间
PMD 支持多种语言,比如项目本身的 Java,Salesforce 相关的 Apex、VisualForce,还有 JavaScript、XML 等。
PMD 对于各种语言都预设了一套代码规则,也支持开发自定义规则,可以使用 Java 类或者 XPath。以后的文章我们会详细阐述。
PMD 的工作原理
PMD 将代码转化为抽象语法树(AST,Abstract Syntax Tree)。
抽象语法树是将代码结构通过“树”的形式展现出来,每部分代码(类、变量声明、if-else 语句、变量赋值、数据库查询等)会成为树的各个节点。
在代码转化为语法树后,PMD 中制定的规则会检测树的相应节点,分析其属性或结构,从而找出违反规定的部分。
举个例子。
下面的这段 Apex 代码
在转化为语法树之后,其结构是:
可以看到,树的根节点就是类的声明,然后子节点就是类中的函数,再往下是 if 语句等元素。
PMD 的命令行使用
PMD 可以通过命令行来对代码进行检测。
首先下载 PMD 的发行包:
解压之后,文件夹的结构应该是这样:
然后需要我们自己加入规则集文件。
规则集文件是一个 XML 文件,其中通过 rule 节点来引用已经开发的规则。
详细步骤见官方文档。
这里是一个示例,文件名叫 rules.xml。
<?xml version="1.0"?>
<ruleset name="Custom Rules"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
<description>
My custom rules
</description>
<!-- Your rules will come here -->
<rule ref="category/apex/bestpractices.xml">
</rule>
<rule ref="category/apex/codestyle.xml">
</rule>
<rule ref="category/apex/design.xml">
</rule>
<rule ref="category/apex/documentation.xml">
</rule>
<rule ref="category/apex/errorprone.xml">
</rule>
<rule ref="category/apex/performance.xml">
</rule>
<rule ref="category/apex/security.xml">
</rule>
</ruleset>
准备一个代码文件,比如叫 testApex.cls,将它和 rules.xml 文件放在 PMD 的文件夹下。
内容非常简单,是一个空的类:
public class exampleClass {
}
在命令行中进入 PMD 文件夹,然后运行命令:
binpmd.bat -d testApex.cls -R rules.xml
命令行输出如图:
检测到了两个违反规则的部分:
- 类名需要大写开始
- 空的类需要有文档
以上就是简单的命令行使用。
PMD 也可以集成在 部署过程和 IDE 中使用,比如 Eclipse、Ant、IDEA 等。