bru*_*uto 5 gradle kotlin gradle-kotlin-dsl
试图将这个项目的构建迁移到 GSK。我们在 Groovy 中有这个:
allprojects {
apply plugin: 'java'
...
sourceSets {
...
}
sourceCompatibility = ...
}
Run Code Online (Sandbox Code Playgroud)
因此,在弄清楚如何在 Kotlin 中访问插件约定时,我发现:
allprojects {
plugins {
java apply true
}
...
println("Project $name, plugins: ${plugins}") // empty list
val java = the<JavaPluginConvention>() // throws exception
}
Run Code Online (Sandbox Code Playgroud)
但如果你这样做:
allprojects {
apply {
plugin(JavaPlugin::class.java)
}
}
Run Code Online (Sandbox Code Playgroud)
应用了插件并且约定变得可访问
什么?
awe*_*old 15
此问题并非 Kotlin 特有的,而是由竞争条件引起的。在评估脚本时,它可能尚未将插件添加到类路径中。这是创建该块的众多原因之一plugins,因为它是在一个阶段中的其余脚本评估之前专门评估的buildscript。尽管如此,只有当该块位于脚本顶部时才会进行这种特殊处理,而不是在 orsubprojects块内时进行allprojects,因为这些块在技术上是任意的,并且稍后会进行评估以确保其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")
}
Run Code Online (Sandbox Code Playgroud)
Gradle用户指南很好地解释了如何使用它们,以及在多模块项目中需要考虑的平衡。
由于某些插件的编写方式的性质,可能会出现其他问题,但如果插件作者遵循最佳实践指南,那就没问题。
| 归档时间: |
|
| 查看次数: |
5230 次 |
| 最近记录: |