動機
コーディングルールチェックのためにPHP Codesnifferを使っているが、
phpcsかけ忘れることが多々あったので、コミットしたタイミングで強制的にphpcsかけてくれるhookスクリプトを作ってみた。
Pull Requestを作った時にphpcsの指摘見つけたら自動的に指摘をpostするWebhook作ったけど、実際にプロジェクトで使ってみたら、PR作成直後に大量に指摘されて「あちゃー」ってなる事態が結構あったので、それを防ぐためになんかできないかなーと思ったのが動機。
作った機能
- git commit時に自動で 変更されたファイル単位で PHPCSを自動実行する
- phpcs実行の結果、問題がない場合にはgit commitが正常終了する
- phpcs実行の結果、指摘が残っている場合には commitがキャンセルされる
- コミットメッセージに
PHPCS_SKIP
のキーワードを含めればスキップされる
実行イメージ
- phpcsをかけてエラーが発生した時の表示例
$ git commit -m "テストコミット"
[PHPCS:CakePHP] cakephp/src/Lib/Sample.php <ERROR>
----------------------------------------------------------------------
FOUND 0 ERRORS AND 1 WARNING AFFECTING 1 LINE
----------------------------------------------------------------------
19 | WARNING | Doc comment for parameter "$apiKey" missing
----------------------------------------------------------------------
[PHPCS:CakePHP] cakephp/src/Shell/SampleShell.php <ERROR>
----------------------------------------------------------------------
FOUND 0 ERRORS AND 1 WARNING AFFECTING 1 LINE
----------------------------------------------------------------------
30 | WARNING | Comment refers to a TODO task
----------------------------------------------------------------------
Oops, PHPCS has not passed.
This commit is CANCELED.
- スキップしたい時のコミット例
git commit -m "[PHPCS_SKIP] テストコミット"
ソースコードと設定方法
自分のGithubアカウントにプロジェクト作ってpushしておいた。
READMEに設定方法などを軽くまとめていますのでそちらをご覧ください。
その他
- phpcbfも自動で実行してもいいかもしれない
- 自前ルールを定義している場合にもgit configで対応できるようにしたつもり
- 当然ながらphpcsの出力仕様が変わるとスクリプトいじらないといけない
- ちなみにPHP7.1 CakePHP3.5でしか動作確認していないけれども、他の環境でもある程度は動くんじゃないかなと思っている
- 導入タイミングが限られる(実プロジェクトではまだ本格導入できてない)
- gulpとかで自動化すればいい話ってもわからなくもない