まずは本家ドキュメント
ルールの内容
ルールセットの作り方
英語だけど翻訳機能を使えば割りと良い感じで読める。
大枠の構成と方針
- ルールセットがあって、それらに単品のチェックルールが入っている構成
- ルールセットも、xmlで定義されている
- ルールのパラメータ上書きもできる(メソッド名は最低3文字など)
- ルールセットの複数指定もできる
今回は、ルールセットを指定して、セットの中の都合の悪いものだけ、無効化する方針とした。
install
composer require --dev "phpmd/phpmd=@stable"
help見る
./vendor/bin/phpmd --help
使えるrulesetとか、出力フォーマットの種類とか、cacheオプションなど色々書いてある
単品ファイルなど、手動でフルチェックしたい場合(controversialは議論のあるルールセットなので外すのも良いかと)
./vendor/bin/phpmd hoge.php text cleancode,codesize,controversial,design,naming,unusedcode
ファイル数が多く実行時間が長い場合、キャッシュしよう
./vendor/bin/phpmd --cache hoge.php text unusedcode
キャッシュファイルが出来上がるので、git使っている場合はignoreに入れておくと良い。
また、デフォルトでは、ファイルのhash値をキャッシュに保存しておき、変更を検知する仕組みとなる。
(更新日付で管理することも可能らしいが、問題なければデフォルトで良さそう)
標準出力も受け取れるので、生成コードのチェックなども出来る
cat hoge.php | ./vendor/bin/phpmd - text unusedcode
gitの差分ファイルをphpmdでチェックする場合
git diff --name-only | fgrep '.php' | xargs -I {} ./vendor/bin/phpmd {} text unusedcode
自作のconfigファイルを使う場合
./vendor/bin/phpmd tests text phpmd_config.xml
自作xmlサンプル(途中からプロジェクトに入れる流れの中で作成した)
<?xml version="1.0"?>
<ruleset name="My first PHPMD rule set"
xmlns="http://pmd.sf.net/ruleset/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0
http://pmd.sf.net/ruleset_xml_schema.xsd"
xsi:noNamespaceSchemaLocation="
http://pmd.sf.net/ruleset_xml_schema.xsd">
<description>
My custom rule set that checks my code...
</description>
<!-- @see https://phpmd.org/documentation/creating-a-ruleset.html -->
<!-- @see https://phpmd.org/rules/index.html -->
<rule ref="rulesets/cleancode.xml">
<exclude name="StaticAccess" />
<exclude name="ElseExpression" />
<exclude name="BooleanArgumentFlag" />
</rule>
<rule ref="rulesets/codesize.xml">
<exclude name="ExcessiveClassLength" />
<exclude name="ExcessiveMethodLength" />
<exclude name="ExcessivePublicCount" />
<exclude name="TooManyFields" />
<exclude name="TooManyMethods" />
<exclude name="TooManyPublicMethods" />
</rule>
<rule ref="rulesets/design.xml">
<exclude name="NumberOfChildren" />
<exclude name="CouplingBetweenObjects" />
</rule>
<rule ref="rulesets/naming.xml">
<exclude name="LongVariable" />
<exclude name="LongClassName" />
<exclude name="ShortMethodName" />
<exclude name="ShortVariable" />
<exclude name="BooleanGetMethodName" />
</rule>
<rule ref="rulesets/unusedcode.xml" />
</ruleset>
vscodeにも入れよう
PHP Mess Detector プラグインを使用した。
使えそうなプラグインが2個あったが、上記で動いたため、もう片方は検証してない。
設定は、下記2項目を設定するだけで動いた。
Phpmd: Command
~/path/to/vendor/bin/phpmd
Phpmd: Rules
~/path/to/phpmd_config.xml
ドキュメントには、 ${workspaceFolder}
が使えると書いてあった。
だが、自分のワークスペースの使い方が独特なのが原因か?、機能しなかったので、フルパスを設定した。
最後に
目視では抜けるものがあったりするので、linterとformatterと自動テストは、最初から入れておきたいと改めて思った。
また、変数名やメソッドのサイズなど細かいルールがあるが、あまり細かくやっても制約になるので、ほどほどの設定が良いと思う。
(コードが読みやすいことと、おかしな点を見つけられることが大事。)