Posted at

gitでコミット時に自動的にPHP CodeSnifferを実行するhookスクリプト

More than 1 year has passed since last update.


動機

コーディングルールチェックのために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に設定方法などを軽くまとめていますのでそちらをご覧ください。

https://github.com/sameyasu/commit-msg


その他


  • phpcbfも自動で実行してもいいかもしれない

  • 自前ルールを定義している場合にもgit configで対応できるようにしたつもり

  • 当然ながらphpcsの出力仕様が変わるとスクリプトいじらないといけない

  • ちなみにPHP7.1 CakePHP3.5でしか動作確認していないけれども、他の環境でもある程度は動くんじゃないかなと思っている

  • 導入タイミングが限られる(実プロジェクトではまだ本格導入できてない)

  • gulpとかで自動化すればいい話ってもわからなくもない