一月 1, 2020 | 後端和Drupal

【D8 Hardcode教學】用 Code Sniffer 來做 Code Review

Coding Standard一直是寫程式的工程師時常提到的議題,有良好的coding standard除了可以減少錯誤之外,還可以增加程式的可讀性、一致性,讓團隊內可以更方便的進行開發的工作。而在Drupal之中,可以使用PHP_CodeSniffer的插件來進行這樣作業,方便我們在開發過程中,可以使用指令的方式,來確認程式碼是否符合Coding Standard。

前言

Coding Standard一直是寫程式的工程師時常提到的議題,有良好的coding standard除了可以減少錯誤之外,還可以增加程式的可讀性、一致性,讓團隊內可以更方便的進行開發的工作。而在Drupal之中,可以使用PHP_CodeSniffer的插件來進行這樣作業,方便我們在開發過程中,可以使用指令的方式,來確認程式碼是否符合Coding Standard。

PHP CodeSniffer

下載網址:https://github.com/squizlabs/PHP_CodeSniffer 主要用途

  • phpcs: 檢查php、javascript、css是否符合coding standard。
  • phpcbf:根據Coding Standard自動修正程式碼,確保程式碼保持乾淨與一致性

Drupal 8 整合 PHP CodeSniffer

在D8的環境之中,可以通過Coder來跟PHP_CodeSniffer進行溝通,來告訴PHP_CodeSniffer目前的程式碼是否符合Drupal的Coding Standard。

備註:在8.x-3.x之後,Javascript的檢查已經從Coder裡面移除,而JS方面的檢查將移到了ESLint,若有興趣可以參考Drupal ESLint文件

安裝與檢查步驟

  1. 安裝 PHP CodeSniffer
  2. 安裝 Coder
  3. 註冊Drupal的Coding Standard到 PHP CodeSniffer
  4. 執行檢測

安裝 PHP CodeSniffer 與 Coder

請先確認你已經有安裝了composer,若沒有安裝,請在參考composer的網站先安裝完畢,再執行以下步驟。

安裝Coder(8.x-3.x)到Global的composer目錄

$ composer global require drupal/coder

為了要讓phpcsphpcbf兩個指令可以使用,需要加入$PATH變數到 ~/.profile, ~/.bash_profile, ~/.bashrc 或 ~/.zshrc

export PATH="$PATH:$HOME/.composer/vendor/bin"

加入以後,務必重新開啟Terminal,這樣才會Work

註冊Coder Standards

PHPCS已經內建了一些Coding Standard,然後有了Coder Sniffer,我們就可以註冊Drupal還有DrupalPractice的Coding Standard到phpcs之中,這樣我們就可以通過指令的方式來使用它。而DrupalDrupalPractice都是屬於檢查Drupal Coding Standard的工具,檢查的項目各有不同,若有興趣,可以再從我放在下面的Reference進去看看。

$ composer global require dealerdirect/phpcodesniffer-composer-installer

輸入完畢上述的指令後,應該會回傳以下的訊息

PHP CodeSniffer Config installed_paths set to ~/.composer/vendor/drupal/coder/coder_sniffer

驗證是否安裝成功

可以通過以下指令來看看結果

$ phpcs -i

output出來的結果應該會有包含DrupalDrupalPractice,就代表成功囉。

用指令來執行檢測

在安裝完畢以後,就可以通過指令來進行檢測程式碼,進行Code Review與Code Repair。

  • 檢查Drupal的Coding Standards【常用】
$ phpcs --standard=Drupal --extensions=php,module,inc,install,test,profile,theme,css,info,txt,md,yml /path/to/drupal/example_module
  • 檢查Drupal的Coding Standards並且忽略掉composer與node.js的資料夾
phpcs --standard=Drupal --extensions=php,module,inc,install,test,profile,theme,css,info,txt,md,yml --ignore=node_modules,bower_components,vendor /path/to/drupal/example_module
  • 列出目前所有啟用的Drupal Coding Standard規則
$ phpcs --standard=Drupal -e
  • 只檢查單一規則
$ phpcs --standard=Drupal --extensions=php,module,inc,install,test,profile,theme,css,info,txt,md,yml --sniffs=Drupal.Classes.UnusedUseStatement /path/to/drupal/example_module
  • 檢查DrupalPractice規則
$ phpcs --standard=DrupalPractice --extensions=php,module,inc,install,test,profile,theme,css,info,txt,md,yml /path/to/drupal/example_module
  • 自動修復符合Coding Standardphpcbf指令將提供我們自動修正的功能,而當然這個也並非是神器可以一次修改完全部,部分問題還是要交給自己來修復囉。
$ phpcbf --standard=Drupal --extensions=php,module,inc,install,test,profile,theme,css,info,txt,md,yml /path/to/drupal/example_module

使用暱稱來縮減指令

若你覺得每次都要打這麼多指令,是很麻煩的事情,那其實有個簡單的方法,就是通過Alias的方式來縮減我們的指令,只需要將以下指令貼到你的 ~/.profile, ~/.bash_profile, ~/.bashrc 或 ~/.zshrc之中,重新啟動即可

alias drupalcs="phpcs --standard=Drupal --extensions='php,module,inc,install,test,profile,theme,css,info,txt,md,yml'"
alias drupalcsp="phpcs --standard=DrupalPractice --extensions='php,module,inc,install,test,profile,theme,css,info,txt,md,yml'"
alias drupalcbf="phpcbf --standard=Drupal --extensions='php,module,inc,install,test,profile,theme,css,info,txt,md,yml'"

簡潔後的指令

$ drupalcs sites/all/modules/mymodule
$ drupalcsp sites/all/modules/mymodule
$ drupalcbf sites/all/modules/mymodule

結論

好的Coding Standard是團隊內一個重要的規範,而上述的流程則完善的使用在Drupal的開發流程之中,好處當然不在話下,不僅可以幫助每一個開發工程師來檢測,並且讓工程師能夠有效率的開發出完善的程式碼,若將上述的流程整合在CI/CD的流程之中,將會跟對整體啊的DevOps流程更方便且完善。

Reference

  1. https://www.drupal.org/docs/develop/standards
  2. https://www.drupal.org/docs/8/modules/code-review-module/installing-coder-sniffer
  3. https://github.com/squizlabs/PHP_CodeSniffer
  4. https://www.drupal.org/node/1587138
  5. https://www.drupal.org/project/drupalpractice