そこのてべすてん、いい加減にdetektを学びなさい
github repo
こういう記事もある
📊 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
で実行
jarになってるのはktlintと変わらないね
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"
}
detekt itself provides a wrapper over ktlint as the formatting rule set which can be easily added to the Gradle configuration:
訳:
detekt自身はktlintのラッパーをフォーマットルールセットとして提供しており、Gradleの設定に簡単に追加することができます:
https://github.com/detekt/detekt?tab=readme-ov-file#adding-more-rule-sets
あんまピンときてないぞぞぞ
複雑さのルールセットなるものがあって、ktlintとは結構毛並みが違うな。
たとえばif式の条件長くしすぎると読みずらいから関数に切り出してね的な
val str = "foo"
val isFoo = if (str.startsWith("foo") && !str.endsWith("foo") && !str.endsWith("bar") && !str.endsWith("_")) {
// ...
}
val str = "foo"
val isFoo = if (str.startsWith("foo") && hasCorrectEnding()) {
// ...
}
fun hasCorrectEnding() = return !str.endsWith("foo") && !str.endsWith("bar") && !str.endsWith("_")
coroutineのルールもあるらしい
特定のruleをoffにしたいとかはどうやるんだろう
Suppressはktlintと同様にできる
Please note that rules inside the formatting ruleset can only be suppressed at the file level.
フォーマットルールセット内のルールは、ファイルレベルでしか抑制できないことに注意してください。
https://detekt.dev/docs/introduction/suppressing-rules
プロジェクトレベルで無効化とかはできなそう