在自定义 Gradle 插件中应用 org.jetbrains.kotlin.jvm 无效

Applying org.jetbrains.kotlin.jvm within custom Gradle plugin not working

我正在使用 Kotlin 编写自定义 Gradle 插件。目标是应用配置此自定义插件中的某些插件。消费者只需应用自定义插件即可。

问题: 我想在自定义插件中应用这两个 kotlin 插件(和其他插件)(通常可以在 Gradle 构建脚本中像这样应用):

kotlin("jvm") version "1.4.10"
kotlin("plugin.spring") version "1.4.10"

但是在我自己的插件中应用它们时出现了一些问题。

  1. 未找到 jar 任务。我在使用我的插件的项目中收到此投诉。
  2. dependencies 部分的内容,例如 apiimplementation 等也会导致错误,例如 Gradle 不明白它们是什么。

但是,在消费项目中,我可以简单地将下面的行添加到构建脚本中以恢复 jar 任务,并使 dependencies 再次工作:

kotlin("jvm") version "1.4.10"

我还在消耗 Gradle 构建中编写了一种调试功能,只是为了查看应用了哪些插件。当我只应用 我自己的插件(或手动将 kotlin-jvm 添加到脚本中)时,它们都会打印 true 。在我看来,我自己的插件正在发挥作用。

open class GreetingTask : DefaultTask() {

    @TaskAction
    fun greet() {
        println("hello from GreetingTask")
        println(project.pluginManager.hasPlugin("org.springframework.boot"))
        println(project.pluginManager.hasPlugin("io.spring.dependency-management"))
        println(project.pluginManager.hasPlugin("com.github.ben-manes.versions"))
        println(project.pluginManager.hasPlugin("org.jetbrains.kotlin.jvm"))
        println(project.pluginManager.hasPlugin("org.jetbrains.kotlin.plugin.spring"))
        println(project.pluginManager.hasPlugin("java"))
    }
}

到目前为止我在插件中的应用方法:

override fun apply(project: Project) {
    configureRepositories(project)
    configureTesting(project)
    configureJava(project)
    configureSpringBoot(project)
    configureSpringDependencyManagement(project)
    configureKotlin(project)
    configureVersions(project)
    configurePublishing(project)
}

以及设置 Kotlin:

private fun configureKotlin(project: Project) {
    project.pluginManager.apply("org.jetbrains.kotlin.jvm")
    project.pluginManager.apply("org.jetbrains.kotlin.plugin.spring")

    project.tasks.withType(KotlinCompile::class.java).configureEach { task ->
        task.kotlinOptions.freeCompilerArgs = listOf("-Xjsr305=strict")
        task.kotlinOptions.jvmTarget = "11"
    }
}

所有其他 configureXYZ 似乎都很好。

我解决了。问题是我是如何应用插件的。

有效:

build.gradle.kts

buildscript {
    repositories {
        mavenLocal()
        gradlePluginPortal()
    }
    dependencies {
        classpath("com.praqma:demo:1.0.0")
    }
}

apply(plugin = "com.praqma.demo.DemoPlugin")

确实有效:

settings.gradle.kts

pluginManagement {
    repositories {
        mavenLocal()
        gradlePluginPortal()
    }
}

build.gradle.kts

plugins {
    id("gradle.demoPlugin") version "0.0.1-SNAPSHOT"
}