Sublime Text 2 で CakePHP2 の CodeSniffer ルールを適用する
Sublime Text 2 のエディタ上で PHP CodeSniffer を使い、コーディング規約をチェックする方法です。sublime-phpcs プラグインを導入することで、コーディング規約違反のある行がエディタ上に表示されるようになります。
なお、プラグインの公式ページでは phpmd も一緒に導入していますが、PHPMD はヒステリックすぎて個人的にお勧めしない ので省略します。
チュートリアル
CodeSniffer をインストールする
pear install PHP_CodeSniffer
CakePHP のルールセットをインストールする
pear channel-discover pear.cakephp.org
pear install cakephp/CakePHP_CodeSniffer
CodeSniffer のルールセットに追加されているか以下のコマンドで確認。
$ phpcs -i
The installed coding standards are CakePHP, MySource, PEAR, PHPCS, PSR1, PSR2, Squiz and Zend
(CakePHP が含まれていれば OK)
Sublime Text 2 に CodeSniffer プラグインをインストールする
“Package Control: Install Package” で Phpcs
をインストールするだけ。
(Package Control 自体のインストール方法は Installation - Package Control を参照)
Sublime Text の設定
“Preferences > Package Settings > PHP Code Sniffer > Settings - User” を開き、以下のキーを設定する必要があります。
- phpcs_php_path
- phpcs_executable_path
- php_cs_fixer_executable_path
記入例:
{
"phpcs_php_path": "C:\xampp\php\phpcs",
"phpcs_executable_path": "C:\xampp\php\phpcs.bat",
"phpcs_additional_args": {
"--standard": "CakePHP"
},
"php_cs_fixer_executable_path": "C:Users{ユーザー名}AppDataRoamingComposervendorbin"
}
(Windows のみ) phpcs.py を修正する
Windows では、このまま phpcs が実行しても何も結果が表示されません。
(Ctrl + @
でコンソールを開くと [Windows Error]
と出て途中で止まっている)
以下の手順でプラグインのコードを修正してください。
- “Preferences > Browse Packages…” でパッケージディレクトリを開く。
- “Phpcs > phpcs.py” を開く。
- 169行目を以下のように修正 (パラメータに
shell=True
を追加) する。
# proc = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, startupinfo=info, cwd=home)
proc = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, startupinfo=info, cwd=home, shell=True)
プラグインを実行する
PHP ファイルを開いたタブで Ctrl + P > PHP Code Sniffer: Sniff This File
とタイプすれば、コーディング規約違反を検知してくれます。
これでコーディングルール違反でチームメイトにディスられるリスクを回避できるようになりました。
オプション
保存時に Sniff されるのを止める
プラグインインストール後のデフォルトだと、保存するたびに規約違反がサジェストされます。
鬱陶しい場合は “Preferences > Package Settings > PHP Code Sniffer > Settings - User” に下記を追加することでオフにできます。
{
"phpcs_execute_on_save": false
}