PSR-2でLintした結果を見えるようにして、コード品質の最低限を上げる
TL;DR
- Lintの結果をもっと活用しよう。
- Lintの結果をもっと見えるようにしよう。
- 重要なのはコードを介した対話 (総花的だ)
Example - PHP_CodeSniffer
例えばこのコード、if
のあとのカッコの前にspaceがない、if () {} else {}
のbraceがない。
# test.php
<?php
if($a==2)
echo $a;
else
echo '3';
これをPHP_CodeSnifferでチェックすると、エラーが表示される。
$ php phpcs.phar --standard=PSR2 test.php
FILE: C:\Users\ishida\src\test.php
--------------------------------------------------------------------------------
FOUND 7 ERRORS AFFECTING 4 LINES
--------------------------------------------------------------------------------
1 | ERROR | [x] Expected 1 space after closing brace; 0 found
2 | ERROR | [x] Expected 1 space after IF keyword; 0 found
2 | ERROR | [x] Inline control structures are not allowed
2 | ERROR | [x] Whitespace found at end of line
4 | ERROR | [x] Expected 1 space after ELSE keyword; newline found
4 | ERROR | [x] Inline control structures are not allowed
5 | ERROR | [x] Expected 1 blank line at end of file; 2 found
--------------------------------------------------------------------------------
PHPCBF CAN FIX THE 7 MARKED SNIFF VIOLATIONS AUTOMATICALLY
--------------------------------------------------------------------------------
Time: 90ms; Memory: 2.5Mb
PHPのコーディングスタイルをPHP_CodeSnifferで修正する - Qiita
コード規約あると何がウレシイかというと、どうでもいいことでのストレスが減らせる。
コードレビューの時間をどうでもいい指摘ばっかりしたくない。どっちでもいいこととか。4space, 2space, tab とか。
どうでもいいことは、指摘もしたくない。機械的に勝手に直されてほしい。
PHP_CodeSniffer
やphp-cs-fixer
を使おう。
正論だがしかし
正論だし、メリットもわかる。ではなんで徹底されない? 単に、ツールやテクノロジーが足りてない。 知ってればわかるだけの話。やろう。
仕事の生産性上げるのは、仕事だ!
入力支援
エディタなりIDEなりの手元でガンガン支援受けて直すのが一番いい。
コマンド
php-cs-fixer
やPHP_CodeSniffer付属のphpcbf
。
- FriendsOfPHP/PHP-CS-Fixer
- PHP CS Fixerで快適PHPライフ - Fivestar's blog
- コーディング規約自動調整ツールCodeSniffer2とphp-cs-fixer - Qiita
- PHPコードをコマンドで自動整形! Condig Standards Fixer と PHP_CodeSniffer - Qiita
エディタ
- stephpy/vim-php-cs-fixer (vim)
- PHP CS fixerをemacsから使うための関数 (emacs)
- benmatselby/sublime-phpcs (sublime)
- benmatselby/atom-php-checkstyle (atom)
- Using PHP Code Sniffer Tool (phpstorm)
- PHP features The PDT Extension Group eclipse p2 repository (eclipse)
良いタイトルが合ったので、持ってきた。
結果の可視化
Pull Request Review Comment
こんな感じに、GitHub Pull RequestにReview Commentがつくツールやサービスがある。 この行が長過ぎます、という例。
おもにrubyプロジェクトの場合 Hound(Web Service), Hound(OSS), Pronto というのを使う。 各言語ごとにいろいろある。言語ごとに実装してるのマヌケっぽい。
言語中立なのを作った。Saddler
Example - Saddler
プルリクエストに対してテストが走る、その後処理の中で、実行する。
# TravisCIやCircleCIの after testの中で(travisCI用語でafter_script, CircleCI用語でpost test)
git diff --name-only origin/master \
| grep ".*.php$" \
| xargs phpcs --report=checkstyle \
| checkstyle_filter-git diff origin/master \
| saddler report \
--require saddler/reporter/github \
--reporter Saddler::Reporter::Github::PullRequestReviewComment
途中出力
git diff --name-only origin/master \
| grep ".*.php$" \
| xargs phpcs --report=checkstyle
<?xml version="1.0" encoding="UTF-8"?>
<checkstyle version="1.0.0">
<file name="/path/to/code/myfile.php">
<error line="2" column="1" severity="error" message="Missing file doc comment" source="PEAR.Commenting.FileComment"/>
<error line="20" column="43" severity="error" message="PHP keywords must be lowercase; expected "false" but found "FALSE"" source="Generic.PHP.LowerCaseConstant"/>
<error line="47" column="1" severity="error" message="Line not indented correctly; expected 4 spaces but found 1" source="PEAR.WhiteSpace.ScopeIndent"/>
<error line="47" column="20" severity="warning" message="Equals sign not aligned with surrounding assignments" source="Generic.Formatting.MultipleStatementAlignment"/>
<error line="51" column="4" severity="error" message="Missing function doc comment" source="PEAR.Commenting.FunctionComment"/>
</file>
</checkstyle>
と、たぶんなるはずなんだけど、手元にいい感じにsetupしたPHP_CodeSnifferプロジェクト無いので、誰か手伝ってほしい。
メリット
- GitHub上に(CIや別サービスにリンクをたどっていく必要なく)可視化できること。
- コード増分だけに適用出来ること。
- コメントを無視もできるところ。身も蓋もないけど。
Build phases
- TravisCI (after_script)
- CircleCI (post test)
- Jenkins (post build task)
設定したがしかし
設定したら終わりか?
ノー。そこから始まり。 チームがコードをどう考えていくか、をすり寄せ続ける必要がある。
重要なのは
重要なのはコードを介した対話だ!
Saddler 確実に詰まる
設定しかけてわかんなかったらバンバン聞いてください。 @sanemat に。 全員(自分も含めて)シェルスクリプト周りかCIサービス周りで確実に詰まる。
参照
- PHPのコーディングスタイルをPHP_CodeSnifferで修正する - Qiita
- PSR-2 — Coding Style Guide
- 新標準PSRに学ぶきれいなPHP
- More PHP Formatting Options and Bundled Code Styles for PSR-1/PSR-2 and Symfony2 | WebStorm & PhpStorm Blog
- PSR-0はなぜ0(≒最重要)なのか - 泥のように
- PHP CS Fixerで快適PHPライフ - Fivestar's blog
- CakePHP のソースコードのレビュー結果を共有してみる - Qiita
- Saddler
- jser/jser.github.ioの記事をpull request時にLintする仕組み | Web Scratch
- 変更したファイルにrubocopやjscsを実行して pull requestに自動でコメントする – Saddler - checkstyle to anywhere
sanemat {AT} tachikoma.io
Bundle Update as a Service, Tachikoma.io