mike-neckのブログ

Java or Groovy or Swift or Golang

Gradle kotlin DSL の便利機能

f:id:mike_neck:20171113232305p:plain

Gradle のスクリプトを Kotlin で書いていると、タスクが自動的に二つ足されていることに気づいたので、それを使ってみたら、わりと便利だった。


kotlinDslAccessorsReport タスク

現在のプロジェクトが利用できる extension と convention のKotlin 実装コードを表示するタスク.

表示内容からは、現在のプロジェクトにて Kotlin DSL の中で呼び出すことのできるAPIの関数名やパラメーターの型がわかる.

例えば先日リリースしたこちらのプラグインを適用した状態で、 kotlinDslAccessorsReport タスクを実行する.

mike-neck.hatenadiary.com

(スクリプト本体)

plugins {
    id("org.mikeneck.junit.starter.library") version("5.0.2")
}
repositories {
    mavenCentral()
}

(出力内容(一部抜粋))

/**
 * Configures the [junitPlatform][org.junit.platform.gradle.plugin.JUnitPlatformExtension] project extension.
 */
fun Project.`junitPlatform`(configure: org.junit.platform.gradle.plugin.JUnitPlatformExtension.() -> Unit): Unit =
    extensions.configure("junitPlatform", configure)

/**
 * Retrieves the [junit][org.mikeneck.junit.starter.JunitExtra] project extension.
 */
val Project.`junit`: org.mikeneck.junit.starter.JunitExtra get() =
    extensions.getByName("junit") as org.mikeneck.junit.starter.JunitExtra

/**
 * Configures the [junit][org.mikeneck.junit.starter.JunitExtra] project extension.
 */
fun Project.`junit`(configure: org.mikeneck.junit.starter.JunitExtra.() -> Unit): Unit =
    extensions.configure("junit", configure)

/**
 * Adds a dependency to the 'api' configuration.
 *
 * @param dependencyNotation notation for the dependency to be added.
 * @param dependencyConfiguration expression to use to configure the dependency.
 * @return The dependency.
 *
 * @see [DependencyHandler.add]
 */
inline
fun DependencyHandler.`api`(
    dependencyNotation: String,
    dependencyConfiguration: ExternalModuleDependency.() -> Unit): ExternalModuleDependency =
    add("api", dependencyNotation, dependencyConfiguration)

出力内容例の一番最後の部分から、この java-library プロジェクトで 依存ライブラリーを追加する際には DependencyHandler のブロック内で api という関数に 文字列で依存ライブラリーの文字列表現とその設定用の レシーバー付き関数を渡せばよいということがわかる.

他にも、先日のプラグインの記事には書かなかった(つまり隠れコマンド的な) junit という extension の存在も見破られている.(なお、この extension は configure できないのだが…)


kotlinDslAccessorsSnapshot タスク

こちらも、 kotlinDslAccessorsReport とほぼ同様な感じで、現在のプロジェクトで利用可能な conventions / extensions / configurations の一覧を json 形式(ファイル名は project-schema.json)で gradle ディレクトリーの下に出力する.

(出力内容例)

{
    ":": {
        "conventions": {
            "base": "org.gradle.api.plugins.BasePluginConvention",
            "java": "org.gradle.api.plugins.JavaPluginConvention"
        },
        "configurations": [
            "api",
            "apiElements",
            "testRuntimeOnly"
        ],
        "extensions": {
            "ext": "org.gradle.api.plugins.ExtraPropertiesExtension",
            "defaultArtifacts": "org.gradle.api.internal.plugins.DefaultArtifactPublicationSet",
            "junit": "org.mikeneck.junit.starter.JunitExtra",
            "gradlePlugin": "org.gradle.plugin.devel.GradlePluginDevelopmentExtension"
        }
    }
}

ただ、こちらの出力は何に使うのかイマイチわからなかった…