コーディング規約自動調整ツールCodeSniffer2とphp-cs-fixer

  • 91
    Like
  • 0
    Comment

コーディング規約って面倒だよね

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 余談はここから ↓-------------------

コーディング規約に遵守することほど無駄で生産性のないことはないというのが筆者の考え。
守らないって意味じゃなくて頑張ることじゃないって意味。
そう、自動でコーディング規約に沿ったコードに調整してくれればいいわけだが、
意外にこれが難しかったりする。

PHP4のころからPHP_BeautifierphpCodeBeautifierなどの整形ツールは存在した。
しかしこれはいわばオレオレコーディング規約で、
規約を順守するという話とは似て非なるもの。
PHP_CodeSnifferという規約を守っているか調べてくれるツールも昔からあった。
しかし、調べてくれるだけで調整は手動。
これが果てしなく面倒くさい。

そこで登場したのがphp-cs-fixer
これはPSRというフレームワーク製作者が一堂に会してあれこれ決めている規約があり、
それに順守するように調整してくれるツール。
これ自体は非常に使いやすく筆者のnetbeansにて常時稼働している
さらにPHP_CodeSnifferもバージョン2にてphpcbfというツールが追加され、
内容を調整する機能が備わった。

じゃあ、自分のリポジトリにコミットしたときに、
ついでに整形してくれれば楽でいいじゃん。
gitにcommitする段階で調整してくれる流れを考えてみよう。
さらにJenkins CIでpushを受け付けた段階でチェックする方法も模索してみよう。

今回はgitやJenkins CIを扱う前に、
まずphp-cs-fixerPHP_CodeSnifferの使い方を学ぶとしよう。

------------------- ↑ 余談はここまで ↑ -------------------

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

php-cs-fixer

php-cs-fixerとは

The PHP Coding Standards Fixer tool fixes most issues in your code when you want to follow the PHP coding standards as defined in the PSR-1 and PSR-2 documents.

コーディング規約PSR-1、PSR-2そったコードに整形してくれるツール。
特徴は修正内容を一つ一つ指定できることで、
PSRx規約以外でも柔軟に使うことができる。
今はsymfony対応を頑張ってるようだ。

インストール

pharファイルにパッケージ化されているので、
ダウンロードするだけで使用できる。

$ wget http://get.sensiolabs.org/php-cs-fixer.phar
$ php php-cs-fixer.phar --version

使い方

fixというオプションをつけると該当するファイルを整形する。
基本的にファイルを上書きするので注意。
※cygwin上だとfixerフラグの設定をうまく拾ってくれないっぽい

$ php php-cs-fixer.phar fix [ファイル名]

オプション

変更する内容足したり引いたりすることができる。
オプションの内容は以下を参照のこと。
http://cs.sensiolabs.org

PSR2に準拠したい

$ php php-cs-fixer.phar --level=psr2 fix [ファイル名]

インデントと改行コードだけ調整したい場合

カンマ区切りで複数指定

$ php php-cs-fixer.phar --fixers=indentation,linefeed fix [ファイル名]

インデントだけそのままにしたい場合

頭に"-"(マイナス)をつけると、その部分の修正は省略される

$ php php-cs-fixer.phar --fixers=-indentation fix [ファイル名]

ちなみに筆者は

$ php php-cs-fixer.phar --level=psr2 --fixers=-psr0,-indentation,-braces fix [ファイル名]

PHP_CodeSniffer

PHP_CodeSnifferとは

PHP_CodeSniffer tokenises PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.

コーディング規約に沿っているかを調査してくれるツール。
デフォルトで対応しているのはPEAR, PHPCS, PSR1, PSR2, Squiz, Zend。

インストール

pharファイルにパッケージ化されているので、
ダウンロードするだけで使用できる。

 $ wget https://github.com/squizlabs/PHP_CodeSniffer/releases/download/2.0.0RC3/phpcs.phar
 $ php phpcs.phar --version
 $ wget https://github.com/squizlabs/PHP_CodeSniffer/releases/download/2.0.0RC3/phpcbf.phar
 $ php phpcbf.phar --version

使い方

$ php phpcs.phar [ファイル名] # 規約チェック
$ php phpcbf.phar --no-patch [ファイル名] # 自動調整

※ --no-patchオプションはwindowsでなければ不要

サンプル実行

$ php phpcs.phar [ファイル名]
FILE: example_pear.php
--------------------------------------------------------------------------------
FOUND 24 ERRORS AFFECTING 22 LINES
--------------------------------------------------------------------------------
  3 | ERROR | [ ] You must use "/**" style comments for a file comment
  3 | ERROR | [x] Line indented incorrectly; expected at least 41 spaces, found
    |       |     0
  4 | ERROR | [x] Line indented incorrectly; expected 41 spaces, found 0
・・・
 45 | ERROR | [x] Line indented incorrectly; expected at least 4 spaces, found
    |       |     0
 50 | ERROR | [ ] Perl-style comments are not allowed. Use "// Comment." or "/*
    |       |     comment */" instead.
--------------------------------------------------------------------------------
PHPCBF CAN FIX THE 18 MARKED SNIFF VIOLATIONS AUTOMATICALLY
--------------------------------------------------------------------------------

Time: 28ms; Memory: 3.5Mb

カッコ内に"×"(チェック)がついているものが自動調整の対象。

オプション

コーディング標準をPSR2に変更したい

$ php phpcs.phar --standard=PSR2 [ファイル名]
$ php phpcbf.phar --no-patch --standard=PSR2 [ファイル名]

------------------- ↑ 本題はここまで ↑ -------------------

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 余談はここから ↓-------------------

プロジェクト開始当初からPSRを採用している場合を除き、
ほとんどの場合は独自コーディング規約やフレームワーク規約だったりすると思う。
その場合、一つのツールで全部OKみたいな風にはいかないだろう。
これら複数のツールをうまく活用すれば規約に沿ったコードを頑張らなくても作成できるだろう。

世の中全部PSRにすればいいじゃないみたいな風潮だが、
PSRに準拠するにはPHP5.3以上が必要で、
例えばサポートバージョンをPHP5.2.4としているCodeigniter3なんかは準拠できないわけだし、
基本はフレームワークがとっている規約に準拠するのがいいと思う。

かという私はアンチPSRツールを作成中だったりする。
インデントがスペースじゃなくタブなので、
あらゆるツールのインデント機能が使えないからだ。
隠してないから公開はされているけど。
要望があったらちょっとまとめようかな。

あと、似た記事がすでにあった。
http://qiita.com/hshimo/items/e8374fe721492ac4658b
けど、中身は違ってたからいいや。