2014年7月28日 星期一

PHP CodeSniffer with Custom Rule

程式碼的靜態分析是 team work 或者 CI 中很重要的一個環節
而靜態分析,其中的一項功能 coding standard 和 coding style的分析更是可以保護你的眼睛

squizlabs/php_codesniffer 內建有許多 ruleset, 像是 PHPCS, PSR2, PSR1, Squiz, PEAR, Zend etc...

如果你仔細去看每個 Standards 目錄下的 ruleset.xml 和 Sniffs 目錄大概就可以看出
其實他們是互相 include, 然後在自己的 Sniffs 裡做 Overide 或者是定義自己的新規則

例如 PSR2 的 ruleset.xml 裡面就宣告了 reference rule 是 PSR1
而 PSR1 又 include 了像是 Squiz 之類的
如果因為某些歷史/framework 的因素, 你希望盡可能地採用 PSR2, 但是又希望 exclude 掉其中的某一部分, 例如 PSR0 

這時候你可以在 Standards 目錄下建立自己客製化的 ruleset, 目錄裡面只要放 ruleset.xml 
內容是 reference PSR2, 再另外加上你想 exclude 掉的 rule.

但是你要怎麼知道有那些 rule 可以 exclude 呢?
以你想套用大部分的 PSR2 ruleset, 但是又想 exclude 掉 PSR 0 為例.

我們知道 PSR2 引用了 PSR1, 而 PSR1 裡面又包含了 PSR0
所以 Standards/PSR1/Sniffs/Classes/ClassDeclarationSniff.php 裡面會檢查 class 有沒有正確宣告 namespace

想 Exclude 掉這個 rule 的話, 我們可以從目錄拆解出 rule name:
"PSR1.Classes.ClassDeclaration"

大概就是這樣啦~
透過客製化自己的 ruleset, 然後再設定 sublime linter 裡的 code sniffer.
就可以馬上讓你的知道, 自己寫的 code 有沒有符合規則.

畢竟在一開始的時候, 我們可能還沒辦法完全的熟悉 PSR2 的所有細節
就讓 code sniffer 來告訴你吧!

沒有留言:

張貼留言