Multiple projectなgradleのprojectでcheckstyle pluginを有効にする
Multiple projectなgradle projectだと, apply plugin: "checkstyle"
と書いてもそれだけではcheckstyle pluginがうまく動かない.おそらく Unable to create Root Module: config ...
などというエラーとともに死ぬであろう.
というのも,gradle checkstyle pluginのデフォルトの状態だと,各sub projectがおのおの checkstyle.xml
を持っていることを期待しているからである (つまり[sub-project-path]/config/checkstyle/checkstyle.xml
の存在が期待されている).
たいていの場合, checkstyle.xml
を各sub projectが持つというのはやってはおれんので,どこかで一括管理をしてそれを各sub projectから利用したいでしょう.というわけでこう書いてやると良い;
subprojects { // do something... apply plugin: "checkstyle" checkstyle { // do something... configFile = rootProject.file('code_quality/checkstyle/checkstyle.xml') // <= here! } }
subprojects.checkstyle.configFile
に所望の checkstyle.xml
を指定してやると良い.
この例ではproject rootに配置されている code_quality/checkstyle/checkstyle.xml
が各sub projectからも参照されるようになる.
めでたしめでたし.
ミニマルなサンプルを置いておきます.
checkstyle.xml に誤りがある場合の挙動
それはそうと checkstyle.xml
に誤りがあると
Execution failed for task ':your-project:checkstyleMain'. > Unable to create Root Module: config {/path/to/your/checkstyle.xml}, classpath {...}.
みたいなエラーとともに死んでしまう.このエラーメッセージで checkstyle.xml
にエラーがあるとは思うまい.しかしそうなのです.
仕方がないので --stacktrace
オプションを有効にして再度 checkstyleMain
を実行すると,それらしきstacktraceがゲロッと吐かれるので,それをもとにxmlファイルを修正していくことができるようになります.マジかよ,つらい.
このエラーメッセージは本当に不親切だと思うしなんとかなってほしい…… これに出くわした時,checkstyle.xml
に誤りがあるとは全く思っておらず数時間を浪費してしまった.
checkstyle.xml に変数を埋める方法
checkstyle { // do something... configProperties = [ 'checkstyle.cache.file': "${buildDir}/checkstyle.cache", ] }
みたいな感じで build.gradle
で定義してやると, checkstyle.xml
上で
<property name="cacheFile" value="${checkstyle.cache.file}"/>
という感じで変数を利用できるようになる.この build.gradle
側の設定を怠ると不親切なエラーとともに死にます.勘弁してくれ.