LoginSignup
3
4

More than 5 years have passed since last update.

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

Posted at

動機

コーディングルールチェックのために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とかで自動化すればいい話ってもわからなくもない
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4