CakePHPのアプリのコーディング規約チェックを自動で行う方法
みなさんこんにちは。@ryuzeeです。
PHPで書かれたソースコードがコーディング規約に準拠しているかどうか確認するには、PHP_CodeSnifferというツールを使うのはよくご存知だと思いますが、今回はCakePHPを使って書いたソースコードの規約をチェックする方法を紹介します。 なお、このような規約チェックはローカル環境で気が向いた時にやるだけではなく、継続的インテグレーションにも組み込んで実施することが望まれます。
PHP_CodeSnifferのインストール
特にチャンネルの追加は必要ありません。
pear install PHP_CodeSniffer
インストールが完了すると、phpcsコマンドがインストールされます。 また標準では、Squiz, PEAR, Zend, MySource, PSR1, PSR2 , PHPCS の7個の規約がインストールされます。このうちMySourceは自分でのカスタマイズ用です。
CakePHP用の規約を導入する
上記でインストールされた規約はどれもCakePHPの規約とは若干異なっています。 なので、cakephpが公式に用意している規約を入手して利用します。
こちらのインストールもpearコマンドを使えばOKです。
pear channel-discover pear.cakephp.org
pear install cakephp/CakePHP_CodeSniffer
これで準備が完了しました。
規約チェックを行う
手元にサンプルアプリケーションを用意して早速検証しましょう。 サンプルの構成は、2テーブルからなる単純なもので、その他にVendorディレクトリに外部モジュールが入っています。
phpcs --report=summary --standard=CakePHP --extensions=php ./app
これで./app以下を対象にした概要レポートが出力されます。概要だけなのでレポートはシンプルです。
詳細を出力したい場合は、引数のreportをcheckstyleに変更します。あわせてファイルに結果を出力します。
phpcs --report=checkstyle --report-checkstyle=./reports/checkstyle.xml \
--extensions=php ./app
これでcheckstyle.xmlにXML形式で詳細が出力されるようになりました。
ただこのままだと自分が作ったコード以外もチェックされてしまい鬱陶しいことこの上ないので対象ファイルの設定をします。–ignoreオプションにカンマ区切りで指定が可能で正規表現も使えます。
phpcs --report=checkstyle --report-checkstyle=./reports/checkstyle.xml \
--extensions=php --ignore=Vendor/*,Plugin/* ./app
Jenkinsと連携する
Jenkinsで自動で実行するには、Checkstyle PluginをJenkinsにインストールした上で、上記のコマンドラインをビルドのところで設定することになります。
cd ${WORKSPACE} && phpcs --report=checkstyle \
--report-checkstyle=${WORKSPACE}/reports/checkstyle.xml \
--standard=CakePHP --extensions=php \
--ignore=Vendor/*,Plugin/* ./app || id
この時気をつけるのは、標準でphpcsコマンドは1つでも規約違反があると、終了コードでエラーを返すので、コマンドの最後に適当なコマンドをつけて、常に正常終了するように設定しておくことです。
また実行後に./reports/checkstyle.xmlが出力されるので、ビルド後のアクションの設定でCheckstyleの取り込みを選択し、このファイルを指定します。
以上で、設定は完了しました。 実行してみると、以下のように出力されます(左メニューからアクセス)。
で、問題のあった箇所は修正していけばよいでしょう。 件数の推移はプロジェクトのトップページで以下のように見ることができます。
以上で完了です。
まとめ
コーディング規約の準拠チェック等をやる場合に人手でやるのはあまりに非効率です。そもそも機械に任せたほうが正確に検証を行うことができます。そのため自動化して頻繁にチェックし、少なくとも規約違反を増やさないようにしていくと良いのではないかと思います。それによって本来時間をかけるべきところに時間をかけられるようになります。
ただし念のために言っておくと、コーディング規約を定めるべきだ、とか絶対守るべきだ、と言っているわけではないです。 あくまで規約があるのであれば、それは自動検証すべきということです。 このあたりはアプリケーションの規模、開発の規模、アプリケーションのライフサイクル等に依存します。
それでは。