背景

detekt はKotlin用の静的解析ツール。 コードスタイルや特定パッケージのインポート禁止などをチェックできる。

とりあえず組み込む

プロジェクト直下のbuild.gradle

buildscript {
	…
	ext.detekt_version='1.17.1'
	…
	dependencies {
		…
		classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:$detekt_version"
	}
}
allprojects {
    repositories {
		…
		maven { url "https://plugins.gradle.org/m2/" } // detekt
	}
}

モジュールのbuild.gradle

apply plugin: "io.gitlab.arturbosch.detekt"
…
dependencies {
	…
	detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:$detekt_version")
	detektPlugins("io.gitlab.arturbosch.detekt:detekt-cli:$detekt_version")
}
detekt {
    // relative path from module path.
    basePath = projectDir

    // preconfigure defaults
    buildUponDefaultConfig = true

    // activate all available (even unstable) rules.
    allRules = false

    // point to your custom config defining rules to run, overwriting default behavior
    // config = files("$projectDir/config/detekt.yml")

    // a way of suppressing issues before introducing detekt
    // baseline = file("$projectDir/config/baseline.xml")

    reports {
        // checkstyle like format mainly for integrations like Jenkins
        xml {
            enabled = true
            destination = file("detektReport/${name}.xml")
        }
        // observe findings in your browser with structure and code snippets
        html {
            enabled = true
            destination = file("detektReport/${name}.html")
        }
        // similar to the console output, contains issue signature to manually edit baseline files
        txt {
            enabled = true
            destination = file("detektReport/${name}.txt")
        }
        // standardized SARIF format (https://sarifweb.azurewebsites.net/) to support integrations with Github Code Scanning
        sarif {
            enabled = true
            destination = file("detektReport/${name}.sarif")
        }
    }
}

gradle syncする Android StudioのTerminalから gradlew detekt 問題がたくさん出てBUILD FAILEDする レポートが出力されるのを確認

設定ファイルの生成

Android StudioのTerminalから

gradlew detektGenerateConfig
gradlew detektBaseline

以下のファイルが作られる。

  • プロジェクト/config/detekt/detekt.yml
  • プロジェクト/モジュール/detekt-baseline.xml

統一性がないな。配置を揃えよう。

  • プロジェクト/config/detekt/config.yml
  • プロジェクト/config/detekt/baseline.xml

モジュールのbuild.gradleのdetekt{} の中に追記

// a way of suppressing issues before introducing detekt
baseline = file("$rootDir/config/detekt/baseline.xml")

// point to your custom config defining rules to run, overwriting default behavior
config = files("$rootDir/config/detekt/config.yml")

gradlew sync して gradlew detekt すると警告0になる。 なぜなら生成されたbaseline.xmlが既存の警告を行単位で覚えて無効化してるからだ。 XML中の<ID></ID>をまるっとコメントアウトしておく。

設定の変更

config/detekt/config.yml の complexity.警告名 を変更する。

  • complexity.ComplexMethod.threshold を15から24に変更するとメソッドの行数の警告が緩和される。
  • complexity.LargeClass.threshold を600から2000に変更するとクラスの行数の警告が緩和される。

コード上で警告を抑制したい場合は @Suppress(“UnnecessaryAbstractClass”) など警告名を書ける。

その後

早速なにか問題を踏んでしまった。 issueを投げて放置。https://github.com/detekt/detekt/issues/3884