すきま風

勉強したことのメモとか

build.gradle.ktsに移行する! 変換編

以前記事にしたプロジェクトをbuild.gradleからkotlin-dslに移行します。プロジェクト構成などについてはそちらを参照ください。

Spring Boot 2.2.0のリリースに伴いコードを書き直しました (最終更新: 2019/11/14)

※ リンクの記事はspring-data-r2dbc などを入れていますが、これだとdependencyManagementを入れた場合バージョン違いで動かないので、一旦リアクティブなDBアクセスの部分 (adapters.persistence) は外しました。

.gradleファイルと.gradle.ktsファイルは共存できるので、一つずつ変換していくと楽です。
この記事とは別に、Tipsを別記事にまとめています。

setting.gradle.kts

rootProject.name = "demo"

include(":domain", ":configuration", ":adapters:web", ":adapters:api", ":application")

adapters.api.gradle.kts

dependencies {
    implementation(project(":domain"))
    implementation(project(":application"))

    implementation("org.springframework.boot:spring-boot-starter-webflux")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
}

adapters.web.build.gradle.kts

dependencies {
    implementation(project(":application"))
    implementation(project(":domain"))

    implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
    implementation("org.springframework.boot:spring-boot-starter-webflux")
}

application.build.gradle.kts

dependencies {
    implementation(project(":domain"))

    implementation("org.springframework.boot:spring-boot-starter")
}

configuration.build.gradle.kts

import org.springframework.boot.gradle.tasks.bundling.BootJar

apply(plugin = "org.springframework.boot")
apply(plugin = "io.spring.dependency-management")

dependencies {
    implementation(project(":application"))
    implementation(project(":domain"))
    implementation(project(":adapters:web"))
    implementation(project(":adapters:api"))

    implementation("org.springframework.boot:spring-boot-starter-webflux")
}

tasks.getByName<BootJar>("bootJar") {
    mainClassName = "com.example.practice.PracticeApplicationKt"
}

build.gradle.kts

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.springframework.boot.gradle.plugin.SpringBootPlugin

extra["kotlin.version"] = "1.3.50"

plugins {
    id("java")
    id("org.springframework.boot") version "2.2.0.RELEASE" apply false
    id("io.spring.dependency-management") version "1.0.8.RELEASE"
    kotlin("jvm") version "1.3.50"
    kotlin("plugin.spring") version "1.3.50"
}

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

repositories {
    mavenCentral()
    jcenter()
}

val ktlint: Configuration by configurations.creating

dependencies {
    ktlint("com.pinterest:ktlint:0.34.2")
    // testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

subprojects {
    apply(plugin = "kotlin")
    apply(plugin = "org.jetbrains.kotlin.plugin.spring")
    apply(plugin = "io.spring.dependency-management")
    dependencyManagement {
        imports {
            mavenBom(SpringBootPlugin.BOM_COORDINATES)
        }
    }

    java.sourceCompatibility = JavaVersion.VERSION_1_8
    java.targetCompatibility = JavaVersion.VERSION_1_8

    repositories {
        mavenCentral()
    }

    dependencies {
        implementation("org.jetbrains.kotlin:kotlin-reflect")
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
        implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")
        implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
        testImplementation("org.springframework.boot:spring-boot-starter-test") {
            exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
        }
        testImplementation("io.projectreactor:reactor-test")
    }

    tasks {
        withType<Test> {
            useJUnitPlatform()
        }

        withType<KotlinCompile>().configureEach {
            kotlinOptions {
                freeCompilerArgs = listOf("-Xjsr305=strict")
                jvmTarget = "1.8"
            }
        }
    }
}

tasks.register<JavaExec>("ktlint") {
    group = "verification"
    description = "Check Kotlin code style."
    classpath = ktlint
    main = "com.pinterest.ktlint.Main"
    args = listOf("adapters/**/*.kt", "application/**/*.kt", "configuration/**/*.kt", "domain/**/*.kt")
    // to generate report in checkstyle format prepend following args:
    // "--reporter=plain", "--reporter=checkstyle,output=${buildDir}/ktlint.xml"
    // see https://github.com/pinterest/ktlint#usage for more
}

tasks.named("check") {
    dependsOn(ktlint)
}

tasks.register<JavaExec>("ktlintFormat") {
    group = "formatting"
    description = "Fix Kotlin code style deviations."
    classpath = ktlint
    main = "com.pinterest.ktlint.Main"
    args = listOf("-F", "adapters/**/*.kt", "applicatiohn/**/*.kt", "configuration/**/*.kt", "domain/**/*.kt")
}