使用 buildSrc 中的 Kotlin 插件

问题描述 投票:0回答:1

如何从 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")
}
gradle gradle-plugin gradle-kotlin-dsl kotlin-gradle-plugin buildsrc
1个回答
3
投票

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

  1. 将插件添加为依赖项

    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")
    }
    
  2. 使用类或插件 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 Artifactany Maven 存储库发现插件。给定插件 ID,Maven GAV 坐标可以确定如下:

val kmpPluginId = "org.jetbrains.kotlin.multiplatform"
val kmpPluginVersion = "1.9.0"
val kmpMavenGav = "${kmpPluginId}:${kmpPluginId}.gradle.plugin:${kmpPluginVersion}"
© www.soinside.com 2019 - 2024. All rights reserved.