使用 buildSrc 中的 Kotlin 插件

Jor*_*rdi 6 gradle gradle-plugin gradle-kotlin-dsl kotlin-gradle-plugin buildsrc

如何从 buildSrc 插件应用 Kotlin 插件?

\n

我有一个 Kotlin 项目,其 build.gradle.kts 文件包含以下内容:

\n
plugins {\n    application\n    kotlin("jvm")\n    kotlin("plugin.serialization")\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我想在 buildSrc 中创建一个自定义插件:

\n
import org.gradle.api.Plugin\nimport org.gradle.api.Project\nimport org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper\n\nclass MyPlugin: Plugin<Project> {\n    override fun apply(project: Project) {\n        project.pluginManager.apply("org.gradle.application") //This works\n        project.pluginManager.apply("\xc2\xbfkotlin(jvm)?") //<-- Here is my doubt\n        project.pluginManager.apply("\xc2\xbfkotlin(plugin.serialization)?") //<-- Here is my doubt\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

并像这样使用它:

\n
plugins {\n    id("com.example.myplugin")\n}\n
Run Code Online (Sandbox Code Playgroud)\n

aSe*_*emy 4

要从 buildSrc 插件中应用 Gradle 插件,您需要做两件事

\n
    \n
  1. 将插件添加为依赖项buildSrc/build.gradle.kts

    \n

    必须使用Maven 坐标(而不是插件 ID\xe2\x80\xa0)将插件添加为依赖项。插件的 Maven 坐标可以在 Gradle 插件门户中找到。

    \n\n
    // buildSrc/build.gradle.kts\n\nplugins {\n  `kotlin-dsl`\n}\n\ndependencies {\n  // the Maven coordinates of the Kotlin Gradle and Serialization plugins\n  implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20")\n  implementation("org.jetbrains.kotlin:kotlin-serialization:1.7.20")\n}\n
    Run Code Online (Sandbox Code Playgroud)\n
  2. \n
  3. 使用类或插件 ID 应用插件。

    \n

    (请注意,这kotlin("jvm")一个辅助函数,它掩盖了实际的 Gradle 插件 ID,即org.jetbrains.kotlin.jvm

    \n
    class MyPlugin: Plugin<Project> {\n  override fun apply(project: Project) {\n\n    project.pluginManager.apply("org.jetbrains.kotlin.jvm")\n    project.pluginManager.apply("org.jetbrains.kotlin.plugin.serialization")\n\n    // the plugin class for the Kotlin JVM & Serialization plugins\n    project.plugins.apply(org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper::class)\n    project.plugins.apply(org.jetbrains.kotlinx.serialization.gradle.SerializationGradleSubplugin::class)\n  }\n}\n
    Run Code Online (Sandbox Code Playgroud)\n

    (找到插件类并不容易 - 我必须在 jar 中挖掘才能找到插件标记工件,例如kotlin-serialization-1.7.20-gradle71.jar!/META-INF/gradle-plugins/org.jetbrains.kotlin.plugin.serialization.properties

    \n
  4. \n
\n

预编译脚本插件

\n

您可能还想使用预编译的脚本插件。它们允许编写与标准文件更相似的 buildSrc 脚本插件build.gradle.kts,因此您可以在插件块中应用插件。

\n
// buildSrc/src/main/kotlin/conventions/kotlin-jvm.gradle.kts\n\nplugins {\n  kotlin("jvm")\n}\n
Run Code Online (Sandbox Code Playgroud)\n

要启用预编译脚本插件,请确保您kotlin-dslbuildSrc/build.gradle.kts.

\n
// buildSrc/build.gradle.kts\n\nplugins {\n  `kotlin-dsl`\n}\n
Run Code Online (Sandbox Code Playgroud)\n

错误:对类路径上已存在插件的插件请求不得包含版本

\n

当您应用上述步骤并收到错误时会发生什么情况Plugin request for plugin already on the classpath must not include a version

\n

有很多方法可以指定 Gradle 插件的版本(我认为太多了!)。如果您要使用上述步骤更新现有项目,那么您只是使用了另一种指定版本的方法,并且 Gradle 会抛出一条无用的错误消息。

\n

解决这个问题的方法是限制项目指定 Gradle 插件版本的方式数量。可能发生的情况是您添加了一个插件,并且buildSrc/build.gradle.kts也在子项目的插件块中应用了该插件。Gradle 会对你想要哪个版本的插件感到困惑。

\n

修复它的方法是仅在一个位置指定插件版本,并且该位置作为buildSrc/build.gradle.kts.

\n
// my-cool-subproject/build.gradle.kts\n\nplugins {\n  kotlin("jvm")// version "1.9.0" // version is not necessary, it\'s specified in buildSrc/build.gradle.kts\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n
脚注
\n

\xe2\x80\xa0 请注意,实际上可以通过一些操作将插件 ID 用作常规依赖项。Gradle 可以通过Plugin Marker Artifact从任何Maven 存储库发现插件。给定插件 ID,Maven GAV 坐标可以确定如下:

\n
val kmpPluginId = "org.jetbrains.kotlin.multiplatform"\nval kmpPluginVersion = "1.9.0"\nval kmpMavenGav = "${kmpPluginId}:${kmpPluginId}.gradle.plugin:${kmpPluginVersion}"\n
Run Code Online (Sandbox Code Playgroud)\n