PMD 簡介


PMD 的功能

PMD (Programming Mistake Detector) 是一個開源的靜態代碼檢查工具。

GitHub 項目鏈接

靜態代碼檢查就是在不運行代碼的情況下檢查代碼中的內容,然后和事先制定的規則進行比對,指出代碼中不符合規則的部分。

PMD 工具可以在以下方面對項目的開發過程進行幫助:

  1. 在開發階段,讓開發者通過自我檢測發現代碼中的錯誤,及時修改
  2. 在審查階段,減輕人工 pull request 審查的工作量
  3. 通過制定規則(或使用已有的規則),統一項目的代碼規范,提高代碼質量
  4. 新成員可以快速熟悉項目的規范,縮短融入團隊的時間

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

命令行輸出如圖:

運行結果

檢測到了兩個違反規則的部分:

  1. 類名需要大寫開始
  2. 空的類需要有文檔

以上就是簡單的命令行使用。

PMD 也可以集成在 部署過程和 IDE 中使用,比如 Eclipse、Ant、IDEA 等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM