🐥

Androidプロジェクトにdetektを導入する

2021/07/10に公開

はじめに

本記事ではGroovyで書いていきます。
Android Studio 4.2 でプロジェクトを作ったので、初期状態でGradleやKotlinバージョンなどがdetekt導入の必要要件を満たしていました。
上記要件を満たしていない場合は、それぞれバージョンを上げる必要があります。

プロジェクトルートにdetektを追加

buildscript {
    ...
    dependencies {
        ...
        // detekt
        classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.17.1"
	...
    }
}

対象のモジュールにdetektを追加

plugins {
    ...
    id 'io.gitlab.arturbosch.detekt'
    ...
}

なお、DSLを使わない書き方は以下。

...
apply plugin: 'io.gitlab.arturbosch.detekt'
...

試しにdetektで検査をしてみる

プロジェクトルートにて実行。

$ ./gradlew detekt

すると、下記のように出力された。ビルド失敗し、エラーの箇所と内容などが具体的に表示された。

$ ./gradlew detekt

> Task :app:detekt FAILED
naming - 5min debt
        PackageNaming - [MainActivity.kt] at /{your_path}/adding_detekt_sample/app/src/main/java/com/example/adding_detekt_sample/MainActivity.kt:1:1
style - 10min debt
        NewLineAtEndOfFile - [MainActivity.kt] at /{your_path}/adding_detekt_sample/app/src/main/java/com/example/adding_detekt_sample/MainActivity.kt:1:1
        NewLineAtEndOfFile - [ExampleUnitTest.kt] at /{your_path}/adding_detekt_sample/app/src/test/java/com/example/adding_detekt_sample/ExampleUnitTest.kt:1:1

Overall debt: 15min


FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:detekt'.
> Build failed with 3 weighted issues.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 7s
1 actionable task: 1 executed

detekt実行結果の意味

上記お試しで表示されたdetektに関する出力の意味は以下。

内容 意味
naming - 5min debt ネーミングの検査項目で問題があった。修正に5分要する。
PackageNaming - 〜〜 〜〜のファイルの○行×列にPackageNamingの問題があった。
Overall debt: 15min 全ての負債を修正するのに15分要する。
> Build failed with 3 weighted issues. ビルド失敗し、エラーの合計比重は3だった。

検査項目設定のファイルを追加

下記コマンドを実行。

$ ./gradlew detektGenerateConfig

すると下記のパスに、各検査項目を設定できるymlファイルが追加される。
<project-root>/config/detekt/detekt.yml
この時ファイルに書かれている設定がdetektのデフォルト設定となる。

ymlファイルの中身はこんな感じ。

build:
  maxIssues: 0
  excludeCorrectable: false
  weights:
    # complexity: 2
    # LongParameterList: 1
    # style: 1
    # comments: 1

config:
  validation: true
  warningsAsErrors: false
  # when writing own rules with new properties, exclude the property path e.g.: 'my_rule_set,.*>.*>[my_property]'
  excludes: ''
...

先ほど試しに行った検査は、上記ymlの設定、つまりデフォルト設定で実行された。
このymlをいじっていくと、各々の好きな内容でコード解析(検査)できる。

終わりに

実際にmaxIssuesや各検査項目を設定していき、情報を追記する予定です。
さらに最終的に、CIで自動的に検査を回す方法まで書けたらいいなと思っています。

参考サイト

Discussion