すきま風

勉強したことのメモとか

Multi Module ProjectのSpring Boot × Kotlin Applicationにdetektを導入する

仕事で使うことになったので勉強しました 😌
前回の記事 に適用します。

point

  • ktlintはdetekt-formattingを利用する。そのためにmaven kotlinx repositoryを追加する
  • multi moduleすべてを見るようにinput files を設定する
  • checkでdetektも走るようにする

build.gradle.kts

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

// use kotlin 1.4.10 at dependecyManagement
// https://github.com/spring-gradle-plugins/dependency-management-plugin/issues/235
extra["kotlin.version"] = "1.4.10"

// detekt version (pluginとversionをあわせる)
val detektVersion = "1.14.2"

plugins {
    id("org.springframework.boot") version "2.3.4.RELEASE" apply false
    id("io.spring.dependency-management") version "1.0.10.RELEASE"
    id("com.google.protobuf") version "0.8.13" apply false
    id("java")

    // pluginを追加
    id("io.gitlab.arturbosch.detekt") version "1.14.2"
    kotlin("jvm") version "1.4.10" apply false
    kotlin("plugin.spring") version "1.4.10" apply false
}

repositories {
    mavenCentral()
    jcenter()
    // for detekt org.jetbrains.kotlinx:kotlinx-html-jvm
    // これを入れないとdetekt pluginをinstallできない
    maven(url = "https://kotlin.bintray.com/kotlinx")
}

allprojects {
    group = "com.example"
    version = "0.0.1-SNAPSHOT"
}

subprojects {
    // 省略します ;-)
}

// ここからdetektの設定
detekt {
    toolVersion = detektVersion

    // default settingをoverrideする
    config = files("detekt/detekt.yaml")
    buildUponDefaultConfig = true

    // subprojectsのsrc/main|test/kotlinをチェックする
    val sources = subprojects.map { listOf("${it.projectDir}/src/main/kotlin", "${it.projectDir}/src/test/kotlin") }.flatten()
    input = files(sources)
}

// ktlintはdetekt pluginで設定可能なのでこちらを利用する
project.dependencies {
    detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:$detektVersion")
}

// detektをcheckで実行
tasks.named("check") {
    dependsOn(tasks.named("detekt"))
}

tasks.withType<io.gitlab.arturbosch.detekt.Detekt> {
    jvmTarget = "11"
}

kotlin

@SpringBootApplication
class CleanApplication


// detekt 検出を防ぐ
@Suppress("SpreadOperator")
fun main(args: Array<String>) {
    runApplication<CleanApplication>(*args)
}

detekt-formattingを使っている記事が見つからなかったのでちょっとハマった 😔