使用Kotlin编写的用于开发Gradle插件的构建配置

5gfr0r5j  于 2023-03-09  发布在  Kotlin
关注(0)|答案(1)|浏览(159)

我想构建一个用Kotlin编写的Gradle插件,并将其发布到Gradle插件门户。但是,我不清楚需要什么样的构建配置才能实现这一目标。关于Gradle使用的“嵌入式Kotlin”,有很多令人困惑的信息和奇怪的错误。
The plugin development guide没有任何Kotlin+ build.gradle.kts的示例(只有一个使用java-gradle-plugin的简单示例)
有一些关于嵌入式Kotlin的技术细节,但它不清楚明确的需求,并且是更抽象的技术实现,而不是实用的“如何”指南。
使用gradle init(v8.0.2)创建手动设置了Kotlin版本的项目,因此它可能与嵌入的Kotlin版本不匹配

// generated by `gradle init` command

plugins {
    // Apply the Java Gradle plugin development plugin to add support for developing Gradle plugins
    `java-gradle-plugin`

    // Apply the Kotlin JVM plugin to add support for Kotlin.
    id("org.jetbrains.kotlin.jvm") version "1.8.10"
}

构建用Kotlin编写的Gradle插件应使用什么配置?

f87krz0w

f87krz0w1#

据我所知,这些是配置Gradle项目的最佳实践规则,该项目将构建使用Kotlin编写的Gradle插件。
首先,注意标记†和‡

  • ‡ -如果应用了kotlin-dsl插件,这些规则将自动配置
    *MAY† -这是允许的,但强烈建议您不要这样做。绕过此规则可能看起来不错,但可能会导致与Gradle版本或功能或其他插件的不可预见的兼容性问题

使用Kotlin开发Gradle插件-最佳实践规则

*必须仅使用以下插件组合:

  • KotlinDSL插件,它也自动应用java-gradle-pluginembedded-kotlin插件。
plugins {
  `kotlin-dsl`
}
plugins {
  `java-gradle-plugin`
  `embedded-kotlin`
}
plugins {
  `java-gradle-plugin`
  // valid, but be aware of exposing incomatible dependencies
  `kotlin("jvm") version embeddedKotlinVersion` 
}

*不得kotlin("jvm')embedded-kotlinkotlin-dsl一起使用

// ❌ invalid example
plugins {
  `java-gradle-plugin`
  // don't specify two different Kotlin plugins
  `embedded-kotlin`
  `kotlin("jvm") version "1.8.10"
}

*可以†使用任何版本的kotlin("jvm"),但应使用与Gradle相同的版本。有一个助手变量embeddedKotlinVersion将自动提供此功能。

plugins {
   `java-gradle-plugin`
   `kotlin("jvm") version embeddedKotlinVersion`
}
// assume that the current Gradle version is 7.6

plugins {
   `java-gradle-plugin`
    `embedded-kotlin`
}

tasks.withType<KotlinCompile>().configureEach {
   kotlinOptions {
     apiVersion = "1.4"
     languageVersion = "1.4"
   }
}

*不得使用add kotlin-stdlib-jdk8kotlin-reflectKotlin库或gradleKotlinDsl()作为运行时/实施依赖项,因为它们将与Gradle的嵌入式版本冲突,并可能与其他Gradle插件冲突。

  • 应该†使用kotlin-stdlib-jdk8kotlin-reflectgradleKotlinDsl()上的compileOnly()依赖项,并且版本等于embeddedKotlinVersion
  • 必须使用compileOnly(gradleApi())(版本默认为用于构建项目的Gradle版本)可能†与您希望插件支持的Gradle版本不匹配。
  • 必须添加Kotlin编译器参数-java-parameters -Xjvm-default=all -Xsam-conversions=class Xjsr305=strict,以与Config Cache兼容,并提高与Java和Groovy的互操作性
    *应该使用Gradle的Plugin Publishing plugin将插件发布到Gradle插件门户。

示例build.gradle.kts

由于大多数选项由kotlin-dsl插件配置,因此这是构建用Kotlin编写的Gradle插件的最简单方法。
1.使用与您要支持的Gradle版本最匹配的Gradle版本创建项目,因为用于构建插件的Gradle版本将提供大多数默认值。
(虽然可以为每个Gradle版本创建Gradle插件的变体,但这非常复杂,而且Gradle API也不支持)
1.使用以下配置创建build.gradle.kts

// build.gradle.kts

plugins {
  `kotlin-dsl`
  id("com.gradle.plugin-publish") version "$gradlePluginPublishVersion"
}

// Optional: enable stricter validation, to ensure 
tasks.validatePlugins {
  enableStricterValidation.set(true)
}

// create the plugin
// Read more: https://docs.gradle.org/current/userguide/implementing_gradle_plugins.html#plugin-development-plugin
gradlePlugin {
    plugins {
        create("simplePlugin") {
            id = "org.example.greeting"
            implementationClass = "org.example.GreetingPlugin"
        }
    }
}

相关问题