Gradle のスクリプトを Kotlin で書いていると、タスクが自動的に二つ足されていることに気づいたので、それを使ってみたら、わりと便利だった。
kotlinDslAccessorsReport
タスク
現在のプロジェクトが利用できる extension と convention のKotlin 実装コードを表示するタスク.
表示内容からは、現在のプロジェクトにて Kotlin DSL の中で呼び出すことのできるAPIの関数名やパラメーターの型がわかる.
例えば先日リリースしたこちらのプラグインを適用した状態で、 kotlinDslAccessorsReport
タスクを実行する.
(スクリプト本体)
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" } } }
ただ、こちらの出力は何に使うのかイマイチわからなかった…