如何从 buildSrc 插件应用 Kotlin 插件?
我有一个 Kotlin 项目,其中包含包含以下内容的 build.gradle.kts 文件:
plugins {
application
kotlin("jvm")
kotlin("plugin.serialization")
}
我想在buildSrc中创建一个自定义插件:
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper
class MyPlugin: Plugin<Project> {
override fun apply(project: Project) {
project.pluginManager.apply("org.gradle.application") //This works
project.pluginManager.apply("¿kotlin(jvm)?") //<-- Here is my doubt
project.pluginManager.apply("¿kotlin(plugin.serialization)?") //<-- Here is my doubt
}
}
并像这样使用它:
plugins {
id("com.example.myplugin")
}
要从 buildSrc 插件中应用 Gradle 插件,您需要做两件事
将插件添加为依赖项
buildSrc/build.gradle.kts
必须使用 Maven 坐标(而不是插件 ID†)将插件添加为依赖项。插件的 Maven 坐标可以在 Gradle 插件门户中找到。
// buildSrc/build.gradle.kts
plugins {
`kotlin-dsl`
}
dependencies {
// the Maven coordinates of the Kotlin Gradle and Serialization plugins
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20")
implementation("org.jetbrains.kotlin:kotlin-serialization:1.7.20")
}
使用类或插件 ID 应用插件。
(请注意,
kotlin("jvm")
是一个辅助函数,它会掩盖实际的Gradle插件ID,即org.jetbrains.kotlin.jvm
)
class MyPlugin: Plugin<Project> {
override fun apply(project: Project) {
project.pluginManager.apply("org.jetbrains.kotlin.jvm")
project.pluginManager.apply("org.jetbrains.kotlin.plugin.serialization")
// the plugin class for the Kotlin JVM & Serialization plugins
project.plugins.apply(org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper::class)
project.plugins.apply(org.jetbrains.kotlinx.serialization.gradle.SerializationGradleSubplugin::class)
}
}
(找到插件类并不容易 - 我必须在 jar 中挖掘才能找到 插件标记工件,例如
kotlin-serialization-1.7.20-gradle71.jar!/META-INF/gradle-plugins/org.jetbrains.kotlin.plugin.serialization.properties
)
您可能还想使用预编译脚本插件。它们允许编写与标准
build.gradle.kts
文件更相似的 buildSrc 脚本插件,因此您可以在插件块中应用插件。
// buildSrc/src/main/kotlin/conventions/kotlin-jvm.gradle.kts
plugins {
kotlin("jvm")
}
† 请注意,实际上可以通过一些操作将插件 ID 用作常规依赖项。 Gradle 可以通过 Plugin Marker Artifact 从 any Maven 存储库发现插件。给定插件 ID,Maven GAV 坐标可以确定如下:
val kmpPluginId = "org.jetbrains.kotlin.multiplatform"
val kmpPluginVersion = "1.9.0"
val kmpMavenGav = "${kmpPluginId}:${kmpPluginId}.gradle.plugin:${kmpPluginVersion}"