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

aSe*_*emy 1 gradle kotlin gradle-plugin gradle-kotlin-dsl

我想构建一个用 Kotlin 编写的 Gradle 插件并将其发布到 Gradle 插件门户。但是,我不清楚需要什么构建配置来实现这一目标。关于 Gradle 使用的“嵌入式 Kotlin”,有很多令人困惑的信息和奇怪的错误。

\n

插件开发指南没有 \xe2\x80\x99t 任何 Kotlin + 的示例build.gradle.kts(只有一个简单的使用java-gradle-plugin

\n

\xe2\x80\x99s一些关于嵌入式 Kotlin 的技术细节,但是 \xe2\x80\x99s 并没有明确明确的需求,并且比实际的 \xe2\x80\x9chow 到 \xe2\x80\ 更抽象的技术实现x9d 指南。

\n

使用gradle init(v8.0.2) 创建一个手动设置 Kotlin 版本的项目,因此它可能与嵌入的 Kotlin 版本不匹配

\n
// generated by `gradle init` command\n\nplugins {\n    // Apply the Java Gradle plugin development plugin to add support for developing Gradle plugins\n    `java-gradle-plugin`\n\n    // Apply the Kotlin JVM plugin to add support for Kotlin.\n    id("org.jetbrains.kotlin.jvm") version "1.8.10"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

aSe*_*emy 5

据我了解,这些是配置 Gradle 项目的最佳实践规则,该项目将构建用 Kotlin 编写的 Gradle 插件。

\n

首先,注意标记 \xe2\x80\xa0 和 \xe2\x80\xa1

\n
    \n
  • kotlin-dsl\xe2\x80\xa1 - 如果应用插件,这些规则会自动配置
  • \n
  • 可以\xe2\x80\xa0 - 这是允许的,但强烈建议不要这样做。绕过此规则可能看起来没问题,但可能会导致 Gradle 版本或功能或其他插件出现不可预见的兼容性问题
  • \n
\n

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

\n
    \n
  • 必须仅使用这些插件组合:

    \n\n
  • \n
  • 不得kotlin("jvm")embedded-kotlinOR一起使用kotlin-dsl

    \n
    // \xe2\x9d\x8c invalid example\nplugins {\n  `java-gradle-plugin`\n  // don\'t specify two different Kotlin plugins\n  `embedded-kotlin`\n  kotlin("jvm") version "1.8.10"\n}\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • \ xe2 \x80\xa0 可以使用任何版本的kotlin("jvm"),但应该使用与 Gradle 使用的版本相同的版本。有一个辅助变量 ,embeddedKotlinVersion它将自动提供此功能。

    \n
    plugins {\n   `java-gradle-plugin`\n   kotlin("jvm") version embeddedKotlinVersion\n}\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • \xe2\x80\xa1必须按照Gradle 兼容性矩阵适当设置Kotlin 语言级别

    \n
    // assume that the current Gradle version is 7.6\n\nplugins {\n   `java-gradle-plugin`\n   `embedded-kotlin`\n}\n\ntasks.withType<KotlinCompile>().configureEach {\n   kotlinOptions {\n     apiVersion = "1.4"\n     languageVersion = "1.4"\n   }\n}\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 不得使用 addkotlin-stdlib-jdk8kotlin-reflectKotlin 库,或gradleKotlinDsl()作为运行时/实现依赖项,因为它们会与 Gradle\xe2\x80\x99s 嵌入式版本冲突,并可能与其他 Gradle 插件冲突。

    \n
  • \n
  • \xe2\x80\xa1应该\xe2\x80\xa0 使用、和compileOnly()上的依赖项,其版本等于kotlin-stdlib-jdk8kotlin-reflectgradleKotlinDsl()embeddedKotlinVersion

    \n
  • \n
  • \xe2\x80\xa1必须使用compileOnly(gradleApi())(版本默认为用于构建项目的 Gradle 版本)可以 xe2\x80\xa0 可以与您希望插件支持的 Gradle 版本不匹配。

    \n
  • \n
  • \xe2\x80\xa1必须添加Kotlin 编译器参数 -java-parameters -Xjvm-default=all -Xsam-conversions=class Xjsr305=strict以与配置缓存兼容,并改进与 Java 和 Groovy 的互操作性

    \n
  • \n
  • 使用 Gradle 的插件发布插件将插件发布到 Gradle 插件门户。

    \n
  • \n
\n

一个例子build.gradle.kts

\n

由于大多数选项都是由kotlin-dsl插件配置的,因此这提供了构建用 Kotlin 编写的 Gradle 插件的最简单方法。

\n
    \n
  1. 使用与您想要支持的 Gradle 版本最匹配的 Gradle 版本创建项目,因为用于构建插件的 Gradle 版本将提供大多数默认值。

    \n

    (虽然可以为每个 Gradle 版本创建 Gradle 插件的变体,但这非常复杂并且 Gradle API 不能很好地支持)

    \n
  2. \n
  3. build.gradle.kts使用以下配置创建一个:

    \n
  4. \n
\n
// build.gradle.kts\n\nplugins {\n  `kotlin-dsl`\n  id("com.gradle.plugin-publish") version "$gradlePluginPublishVersion"\n}\n\n// Optional: enable stricter validation, to ensure Gradle configuration is correct\ntasks.validatePlugins {\n  enableStricterValidation.set(true)\n}\n\n// create the plugin\n// Read more: https://docs.gradle.org/current/userguide/implementing_gradle_plugins.html#plugin-development-plugin\ngradlePlugin {\n  plugins {\n    create("simplePlugin") {\n      id = "org.example.greeting"\n      implementationClass = "org.example.GreetingPlugin"\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n