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 文件夾,然后運行命令:
bin\pmd.bat -d testApex.cls -R rules.xml
命令行輸出如圖:
檢測到了兩個違反規則的部分:
- 類名需要大寫開始
- 空的類需要有文檔
以上就是簡單的命令行使用。
PMD 也可以集成在 部署過程和 IDE 中使用,比如 Eclipse、Ant、IDEA 等。