1. 概要

Groovyは、Gradleスクリプトを作成するためのデフォルトの言語です。 ただし、Gradleバージョン5.0以降、これらのスクリプトはKotlinでも記述できます。

このチュートリアルでは、KotlinでGradleスクリプトを作成する方法を見ていきます。 また、KotlinDSLスクリプトを使用することのいくつかの長所と短所についても見ていきます。

2. KotlinDSLスクリプトを作成する方法

Kotlin DSLスクリプトを作成するには、Gradleバージョン5.0以降を使用する必要があります。 Kotlin DSLをアクティブにして、最高のIDEサポートを取得するには、次の拡張機能を使用する必要があります。

  • ビルドスクリプトでは、.gradleの代わりに.gradle.ktsを使用します
  • すべての設定スクリプトで、.settings.gradleの代わりに.settings.gradle.kts
  • 初期化スクリプトの場合、.init.gradleの代わりに.init.gradle.kts

3. Javaライブラリの基本的なGradleスクリプトを作成する方法

このセクションでは、KotlinDSLスクリプトで記述されたGradleスクリプトのさまざまな構成要素について説明します。 また、GroovyDSLで同じスクリプトを作成する場合との違いについても見ていきます。

3.1. プラグインの適用

コアプラグインであるjava-libraryプラグインを適用できます。

plugins {
    `java-library`
}

コアプラグインには、Groovy DSLとは異なり、id関数を指定する必要がないことに注意してください。

完全修飾プラグインidおよびバージョンを指定することでコミュニティプラグインを適用できます。

plugins {
    id("org.flywaydb.flyway") version "8.0.2"
}

3.2. 依存関係の宣言

タイプセーフアクセサーを使用して、さまざまなタイプの依存関係を宣言できます。

dependencies {
    api("com.google.inject:guice:5.0.1")
    implementation("com.google.guava:guava:31.0-jre")
    testImplementation("org.junit.jupiter:junit-jupiter-api:5.6.0")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
}

ここで注意すべき重要な点は、 Kotlin DSLは、プラグイン{}ブロックの直後にGradleスクリプトの本体で4つのアクセサーすべてを使用できるようにすることです。 これは、このスクリプトを作成するときに、サポートされているIDEでタイプセーフなオートコンプリートが行われることを意味します。 これにより、高速で優れたスクリプトエクスペリエンスが実現します。

3.3. リポジトリの宣言

タイプセーフアクセサーを使用して、組み込みリポジトリとカスタムリポジトリの両方を宣言できます。

repositories {
    mavenCentral()
    maven {
        url = uri("https://maven.springframework.org/release")
    }
}

依存関係を解決する際、Gradleは最初に maven-central リポジトリをチェックし、次にspringframeworkリポジトリをチェックします。

3.4. ソースセットの構成

統合テスト用に別のソースセットを定義したいとします。 プロジェクトのレイアウトは次のとおりです。

gradle-kotlin-dsl 
  ├── src 
  │    └── main 
  │    |    ├── java 
  │    |    │    ├── DefaultSorter.java
  │    |    │    ├── InMemoryRepository.java
  │    |    │    ├── Reporter.java
  │    |    │    ├── Repository.java
  │    |    │    ├── Sorter.java
  │    ├── test 
  │    |    ├── java 
  │    |    │    └── DefaultSorterTest.java
  │    |    │    └── InMemoryRepositoryTest.java
  │    |    │    └── ReporterTest.java
  │    └── integrationTest 
  │         └── java 
  │              └── ReporterIntegrationTest.java
  └── build.gradle

IntegrationTestソースセットを次のように定義できます。

sourceSets {
    create("integrationTest") {
        compileClasspath += sourceSets.main.get().output
        runtimeClasspath += sourceSets.main.get().output
    }
}

この設定では、compileIntegrationTestJavaというGradleタスクを作成します。 このタスクを使用して、 src / IntegrationTest /javaディレクトリ内のソースファイルをコンパイルできます。

3.5. カスタムGradleタスクの定義

統合テストを実行するためのタスクが必要です。 KotlinDSLを使用して作成できます。

val integrationTest = task<Test>("integrationTest") {
    description = "Task to run integration tests"
    group = "verification"

    testClassesDirs = sourceSets["integrationTest"].output.classesDirs
    classpath = sourceSets["integrationTest"].runtimeClasspath
    shouldRunAfter("test")
}

ここでは、ProjectオブジェクトにアタッチされたKotlin拡張関数taskを使用してカスタムタスクを作成しました。 これは、 TaskContainer オブジェクトを使用してカスタムタスクを作成するため、Groovy構文とは異なります。 これはKotlinDSLでも可能ですが、より冗長です。

4. IDEサポート

Kotlinは静的に型付けされた言語であるため、Groovyとは異なり、IDEはオートコンプリート、ソースコードナビゲーション、リファクタリングサポート、Gradleスクリプトのエラー強調表示などのいくつかの便利な機能を提供できます。 これは、KotlinまたはJavaでアプリケーションコードを作成するときに通常行うのと同様のコーディングエクスペリエンスを享受できることを意味します。 現在、IntelliJIDEAとAndroidStudioは、KotlinDSLに最適なサポートを提供しています。

5. 制限事項

Kotlin DSLには、特にスクリプトのコンパイル速度を比較する場合、Groovyと比較していくつかの制限があります。 Gradle公式ウェブサイトで言及されている他のいくつかの珍しい制限があります。

6. 結論

この記事では、KotlinDSLを使用してGradleスクリプトを作成する方法を学びました。 また、Groovyで記述されたGradleスクリプトとKotlinDSLで記述されたスクリプトの違いについても調べました。

いつものように、すべてのコード例はGitHubから入手できます。