36
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPの低品質なコードをコミット前に自動的に検査する

Last updated at Posted at 2015-10-08

出発点:コード汚すぎ問題を解決したい

したい(したい)。ツールに頼れるとこは頼りたい。

解決策

  • PHPのコーディング規約を強制的にPSR-2基準にしたい。
  • 複雑すぎるコードを事前に見つけたい。
    • PHPMDを使って循環的複雑度が高すぎないかとか検査しよう!

phpmdやphp-cs-fixerなどのツールをcomposerでグローバルにインストールしてやって、手動で毎回コードチェックのコマンドを叩けば問題をクリアできます。

composer global require "fabpot/php-cs-fixer"
composer global require "phpmd/phpmd"

コミット前にphp-cs-fixerとか打つのめんどいし忘れる

ツールを手動でかけるだけだと↑のような問題が起きます。自動化したい。する。
具体的にはGitのpre-commitというコミット時のフックを利用します。

自動化の手順

以下のmanatenさんの記事を参考に導入します。

GitHub Desktopとかつかいたくない?

ここまでで殆どの人は満足できる結果になるかもしれません。manatenさんありがとうございます。
わたしの運用だと以下の問題がおきたので、これを解決していきます。

  1. git add -pが意味を成さない
  2. GitHub Desktopが使えなくなる

これらの点を反映したスクリプトはGistで公開しています。PHPMDのルールは公式ページのリファレンスを見ながら適宜変更してください。

1を解決:git add -pを使えるようにpre-commitを改変する

上のエントリで紹介されているpre-commitのスクリプトは、php-cs-fixerをかけた後に自動的にgit addされるので便利です。しかし、git add -pでコミットを切り分けることができなくなるのでこのコマンドを使う場合には不便です。なので、以下の要件を満たすように一部変更します。

  • php-cs-fixerで修正が必要だった場合、コードの修正を自動で行うがgit addを自動的には行わずにコミットを中断する

副作用(利用上の注意)

  • コミットにフックしたphp-cs-fixerでコードが修正されてコミットが中断された場合、手動でgit addしないと、当該コミットにphp-cs-fixerで修正されたものが入らない。
  • 後述のGitHub Desktopを使うと自動でaddされるので不便さはありません。

2を解決: GitHub Desktop1を使えるようにする

ここまで設定した状態でGitHub Desktopを使うと、phpmdやらのコマンドが見つからないというエラーになります。Stack Overflowに同じ問題を解決している方がいました2

デフォルトでは~/.composer/vendor/binに配置されているので、このpathをpre-commitの先頭に書き込みます。これでGitHub Desktopがそのコマンドを利用することができます。

PATH=$PATH:/Users/YOUR_NAME/.composer/vendor/bin/
  1. GitHub DesktopはGUI上でgit add -pができたりする便利ソフト。GitHub謹製。

  2. Git pre-commit hook failing in GitHub for mac (works on command line) - Stack Overflow

36
41
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
36
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?