cp .env.example .env
# Change `COMPOSE_PROJECT_NAME` in .env
docker compose up -d php
make phpcs
make psalm
make phpmd
cp .env.example .env
# Change `COMPOSE_PROJECT_NAME` in .env
docker compose up -d js
make eslint
make textlint
cp .env.example .env
# Change `COMPOSE_PROJECT_NAME` in .env
docker compose up -d js
make eslint
make textlint
各種ルールはもちろん、すぐにルールを確認できるお手軽なDocker環境と、ルールセットを確認できるように例となるコードを公開している。 コード例は全てを網羅しているわけではない(ベストエフォートで記載)。
https://github.com/squizlabs/PHP_CodeSniffer
PHPの静的解析の老舗。まずはここから。
https://github.com/squizlabs/PHP_CodeSniffer/wiki/Annotated-Ruleset
カスタムルールなどを記載するルールセットファイルの書き方。
https://github.com/cakephp/cakephp-codesniffer
CakePHP Code Sniffer(以下CakePHPCS)はPHPCSのルール集です。 PSR-12に準拠しており、さらに独自ルールを追加しています。
導入後、ルールセットは下記のパスに入っている
vendor/cakephp/cakephp-codesniffer/CakePHP/ruleset.xml
また、CakePHPCSは内部でもう1つのサードパーティーのCode Snifferを使用しています。
https://github.com/slevomat/coding-standard
今まで存在を知らなかったのだけれど、ルールを確認するにかなり強そう。
こちらも静的解析の老舗。PHPCSとは違った観点で問題点を洗い出してくれます。
動画配信サイトVimeoが作っている静的解析ツール。型関連まで指摘をしてくれます。
※QodanaはEAP終了に併せて月間サブスクリプションプランでリリースされます。PHPの解析は有料版でのみ使用可能となるようで、その時点でリポジトリーから削除予定です。
https://www.jetbrains.com/ja-jp/qodana/
JetBrains Qodanaでの静的解析の設定も追加してあります。 QodanaはJetBrains製品に搭載されている静的解析エンジンを使用してコード検証を行えます。 (EAPの間は使用しているDockerイメージに期限があり、イメージ公開からだいたい1か月程度で期限切れエラーを吐きます)
設定が膨大で1つずつ精査しているのは非常に時間がかかるため、今回はベースルールとして qodana.recommended
を採用し、追加でルールを設定しました。
PHPCSやPsalmなどのコマンドラインツールとは違って、日常的に動作させるような軽量なものではないのです。 基本的にはGitHub Actionsを使用するか、ローカルでは必要に応じて設定済みのDocker Composeから起動させてください。
ルールセットはCakePHP Code Sniffer(PSR-12準拠)をベースに構築しています。
PHPCSやPHPMD、Psalmと重複しているルールを残す優先度は下記のようにしました。
- PHP Code Sniffer
- Psalm
- PHP Mess Detector
PHPCSは他の静的解析ツールよりも導入確度が高そうなためです(むしろ入っていないプロジェクトはぜひ導入いただきたい)。
型関連に関しては、PHPCSとPsalmがかぶっていてもそのままとしました。これは型に関してはPsalmに任せたいから、とはいえ、PHPCSでもひとまず指摘はされるようにしておきたいからです。Psalmを入れるプロジェクトの場合、PHPCSの型に関してOFFにしてもよいでしょう。
PsalmとPHPMDについては、型が必須になりつつある時代でPHPの型を補完するシステムが必要と感じているためです(個人的に絶対指摘を入れたい「使用していない変数」に対する指摘がPsalmで可能なのもありがたい)。
- クラス名と関数名のプレフィックスにアンダースコアを許可しないルールを有効化
<exclude name="PSR2.Classes.PropertyDeclaration.Underscore"/>
<exclude name="PSR2.Methods.MethodDeclaration.Underscore"/>
CakePHPCSではアンダースコアーを許可しているため除外されている。
なお、全体的にexclude-pattern
については、そのままにしてあります(おそらくCakePHP準拠)。各プロジェクトで必要な分だけ追加・削除してください。
- Operatorに関する指摘するルールを有効化
<rule ref="Squiz.Operators.ComparisonOperatorUsage"/>
これは例えば==
を許可せず、===
へ書き換えを促す等のルールが追加されます。
Airbnbのスタイルガイドを採用しました。
https://github.com/airbnb/javascript
Airbnbを設定した以外は素の状態です。
JTF標準ルールを採用しています。 プラスで設定があります。設定については、以前記事を書いていますのでそちらも参考にしてください。
https://zenn.dev/naoyukik/articles/537f020909e2eae5155b
対応ツールはそれぞれGitHub ActionsでAnnotationsが出力できるように設定してあります。
また、指摘が存在してもGitHub Actionsのチェックはグリーンになるよう設定されてますので、エラーにする場合などは設定を変更する必要があります。
ESLintは当初SARIFファイルを出力していたのですが、Annotationsで出力できませんでした。 ESLintデフォルト(stylish)で出力したところAnnotationで出力されましたので、GitHub Actionsの出力はデフォルトになっています。
Problem MatcherやSARIFを使用していないのになぜAnnotationsに出力されるかというと、setup-node
が内部でProblem Matcherを設定しているからです。