Open24

そこのてべすてん、いい加減にdetektを学びなさい

てべすてんてべすてん
てべすてんてべすてん

📊 Detekt アクティビティ統計: 2017 年以来 112 リリースで 1,150,000 ダウンロード、Github で 5.9 ⭐️ 🟢
📊 Ktlint アクティビティ統計: 2016 年以来 92 リリースで 3,350,000 ダウンロード、Github で 5.9 ⭐️ 🟢

ktlintの方が人気そう

てべすてんてべすてん
インストール
curl -sSLO https://github.com/detekt/detekt/releases/download/v[version]/detekt-cli-[version]-all.jar

でインストール

実行
java -jar detekt-cli-[version]-all.jar --help

で実行

てべすてんてべすてん
gradleだと
plugins {
    id("io.gitlab.arturbosch.detekt") version "[version]"
}

repositories {
    mavenCentral()
}

detekt {
    buildUponDefaultConfig = true // preconfigure defaults
    allRules = false // activate all available (even unstable) rules.
    config.setFrom("$projectDir/config/detekt.yml") // point to your custom config defining rules to run, overwriting default behavior
    baseline = file("$projectDir/config/baseline.xml") // a way of suppressing issues before introducing detekt
}

tasks.withType<Detekt>().configureEach {
    reports {
        html.required.set(true) // observe findings in your browser with structure and code snippets
        xml.required.set(true) // checkstyle like format mainly for integrations like Jenkins
        txt.required.set(true) // similar to the console output, contains issue signature to manually edit baseline files
        sarif.required.set(true) // standardized SARIF format (https://sarifweb.azurewebsites.net/) to support integrations with GitHub Code Scanning
        md.required.set(true) // simple Markdown format
    }
}

// Groovy DSL
tasks.withType(Detekt).configureEach {
    jvmTarget = "1.8"
}
tasks.withType(DetektCreateBaselineTask).configureEach {
    jvmTarget = "1.8"
}

// or

// Kotlin DSL
tasks.withType<Detekt>().configureEach {
    jvmTarget = "1.8"
}
tasks.withType<DetektCreateBaselineTask>().configureEach {
    jvmTarget = "1.8"
}
てべすてんてべすてん

複雑さのルールセットなるものがあって、ktlintとは結構毛並みが違うな。

https://detekt.dev/docs/rules/complexity/

てべすてんてべすてん

たとえばif式の条件長くしすぎると読みずらいから関数に切り出してね的な

🙅 NG
val str = "foo"
val isFoo = if (str.startsWith("foo") && !str.endsWith("foo") && !str.endsWith("bar") && !str.endsWith("_")) {
    // ...
}
🙆 OK
val str = "foo"
val isFoo = if (str.startsWith("foo") && hasCorrectEnding()) {
    // ...
}

fun hasCorrectEnding() = return !str.endsWith("foo") && !str.endsWith("bar") && !str.endsWith("_")
てべすてんてべすてん

特定のruleをoffにしたいとかはどうやるんだろう