应用插件的不同方式?(Gradle Kotlin DSL)

应用插件的不同方式?(Gradle Kotlin DSL),gradle,kotlin,gradle-kotlin-dsl,Gradle,Kotlin,Gradle Kotlin Dsl,正在尝试将此项目的构建迁移到GSK。 Groovy中有这样的功能: allprojects { apply plugin: 'java' ... sourceSets { ... } sourceCompatibility = ... } 因此,在了解如何访问Kotlin中的插件约定时,我发现: allprojects { plugins { java apply true } ... printl

正在尝试将此项目的构建迁移到GSK。 Groovy中有这样的功能:

allprojects {
    apply plugin: 'java'
...
    sourceSets {
        ...
    }
    sourceCompatibility = ...
}
因此,在了解如何访问Kotlin中的插件约定时,我发现:

allprojects {
    plugins {
        java apply true
    }
    ...
    println("Project $name, plugins: ${plugins}") // empty list
    val java = the<JavaPluginConvention>() // throws exception
}
插件被应用,约定变得可访问


这个问题不是科特林特有的,是由于比赛条件造成的。当脚本被评估时,它可能还没有将插件添加到类路径中。这是创建
plugins
块的众多原因之一,因为在
buildscript
阶段,它是在脚本评估的其余部分之前进行评估的。尽管如此,这种特殊处理仅在该块位于脚本顶部时进行,而不是在
子项目
所有项目
块内时进行,因为这些块在技术上是任意的,稍后会进行评估以确保
构建脚本
是幂等的。在你的情况下,你只是把它放在
allprojects
块中,从而提升了比赛的水平,而且你很幸运

在处理多项目生成时,这是有问题的,但是如果可能,最好是在
plugins
块中使用
apply false
约束语法声明插件,以便在
buildscript
阶段将其添加到生成的类路径中。然后,您可以在脚本评估期间通过插件的id应用插件(不需要版本,因为它只用于获取依赖项)

例如:

plugins {
    id("org.gradle.sample.hello") version "1.0.0" apply false
}

subprojects {
    apply(plugin = "org.gradle.sample.hello")
}
<>这是一个很好的工作,解释如何使用这些,以及在多模块项目中需要考虑的平衡。


由于某些插件的编写方式的性质,可能会出现其他问题,但是如果插件作者遵循最佳实践指南,您会没事。

您是否尝试了
配置。提供了
?我的问题是,我的扩展java getter返回的值为空
plugins {
    id("org.gradle.sample.hello") version "1.0.0" apply false
}

subprojects {
    apply(plugin = "org.gradle.sample.hello")
}