kotlin - 如何使用 Kotlin DSL 将插件应用到自身?

标签 kotlin gradle gradle-plugin gradle-kotlin-dsl kotlin-gradle-plugin

我们有一个现有的插件项目,它配置各种内容(包括静态分析),我们希望将插件应用到项目本身。

当前适用于用 Java 编写的插件的方式是,将 Java src 目录添加到 buildSrc 项目中,然后可以在主项目中使用在那里构建的类。所以我试图让同样的事情适用于以 Kotlin 脚本编写的插件。

但是当我尝试构建它时,编译 buildSrc 失败并显示:

e: C:\Users\Trejkaz\Documents\test\self-applying-gradle-plugin\src\main\kotlin\example.common.gradle.kts: (1, 1): Unresolved reference: allprojects

> Task :buildSrc:compileKotlin FAILED

要完成这项工作还缺少什么?

进一步调查:

  • 如果我将文件的副本放入 buildSrc/src/main/kotlin 中,就可以了。
  • 如果我将文件的副本放入 buildSrc/src/main/kotlin2 中并使用 srcDirs 设置该目录,也会失败。所以看起来确实有什么东西根本不允许我重新定位源

我推了a repo to play with this here但接下来是构建脚本的内容,以防它被删除。

主要的build.gradle.kts:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    `java-gradle-plugin`
    `kotlin-dsl`

    // Matching version in Gradle
    kotlin("jvm") version "1.5.31"
}

apply(from = "common-build.gradle.kts")

apply(plugin = "example.common") // 👈 trying to apply the compiled plugin here

group = "org.example"
version = "1.0-SNAPSHOT"

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "11"
}

buildSrc/build.gradle.kts 中,我们有这个 - 请注意,它为主目录中的源代码添加了一个源目录:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    `java-gradle-plugin`
    `kotlin-dsl`

    // Matching version in Gradle
    kotlin("jvm") version "1.5.31"
}

apply(from = "../common-build.gradle.kts")

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "11"
}

kotlin {
    sourceSets["main"].kotlin.srcDir("../src/main/kotlin")
}

common-build.gradle.kts 具有两个构建脚本共有的所有内容,我们已经弄清楚如何移动到公共(public)位置(值得注意的是,KotlinCompile 是不在那里,稍后我会弄清楚为什么我也不能移动它):

repositories {
    mavenCentral()
}

dependencies {
    // Needed to compile Kotlin stuff but not added by the plugin for some reason
    "implementation"("org.jetbrains.kotlin:kotlin-scripting-jvm")
}

插件脚本 src/main/kotlin/example.common.gradle.kts 包含:

allprojects {
    // Configure something
}

最佳答案

结果是a bug in Gradle's kotlin-dsl plugin .

解决方法是在应用插件之前添加源目录。

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    `java-gradle-plugin`
    `kotlin-dsl` apply false

    // Matching version in Gradle
    kotlin("jvm") version "1.5.31"
}

apply(from = "../common-build.gradle.kts")

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "11"
}

kotlin {
    sourceSets["main"].kotlin.srcDir("../src/main/kotlin")
}

// Workaround for https://github.com/gradle/gradle/issues/21052 -
// apply kotlin-dsl plugin last, because it erroneously fetches source dirs eagerly.
apply(plugin = "org.gradle.kotlin.kotlin-dsl")

关于kotlin - 如何使用 Kotlin DSL 将插件应用到自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72568509/

相关文章:

java - 是否可以创建 ByteArrays 的 ByteArray 作为 kotlin 中的元素?

Gradle多项目并没有产生Lombok的优点

gradle - 无法解析 Gradle 脚本插件中的插件(外部 Gradle 文件)

java - 在 uiThread 中获取 Fuel 结果

android - 如何为 Gson Expose 注释添加支持字段

java - "aapt"IOException 错误=2,没有这样的文件或目录 "why can' t 我在 Jenkins 上构建我的 gradle?

groovy - 如何运行由 gradle 中的插件创建的任务

gradle - groovy/gradle插件无法有条件地构建

mongodb - java.lang.NoSuchFieldError : FSYNCED

gradle - Github Actions VM和本地中不同的gradle输出