不能在插件块中使用项目额外属性



我有一个多项目构建,而且我经常发现自己全面锁定了工件的版本。所以在我的根项目中,我定义了这样的东西:

project.extra.set("pkgVersions", mapOf(
"kotlin" to "1.2.0",
"jooq" to "3.10.2"
))
val pkgVersions : Map<String, String> by project.extra
plugins {
base
kotlin("jvm") version "1.2.0" apply false
}

虽然我可以在任何地方使用pkgVersions,包括其他子项目:

val pkgVersions by rootProject.extra
jooq {
version = pkgVersions["jooq"]
}

我无法在插件块内执行此操作:

plugins {
kotlin("jvm") version pkgVersions["kotlin"]
}

给我错误"在这种情况下,隐式接收器无法调用 pkgVersions。如果需要,请使用明确的"。我假设这是因为隐式接收器可能是文件的 JVM 印象?但相反,它使用的是PluginDependencySpec.尝试使用this@自动完成只会显示this@plugin。这只是我的一个长期猜测。但是,关于我应该做什么的任何指示?

另外,当我们使用它时,有没有办法在gradle-kotlin-dsl中创建全局类型,例如:

data class MyBuildType(..)

并在不使用buildSrc的情况下随处可用?buildSrc非常简单,我不介意使用它,但只是想知道。

显然,如果过去不可能的话,这最近已经成为可能。(几乎)来自文档:

gradle.properties

helloPluginVersion=1.0.0

settings.gradle.kts

pluginManagement {
val helloPluginVersion: String by settings
plugins {
id("com.example.hello") version helloPluginVersion
}
}

现在文档说build.gradle.kts应该是空的,但我的测试表明你仍然需要这个build.gradle.kts

plugins {
id("com.example.hello")
}

版本现在由settings.gradle.kts决定,因此由我们想要gradle.properties决定......

根据文档(请参阅约束语法小节)

«插件

版本»和«插件ID»必须是常量,文字,字符串

在以下段落中,还有一些与您的问题相关的其他注释:

插件 {} 块也必须是构建脚本中的顶级语句。它不能嵌套在另一个构造中(例如 if 语句或 for 循环)。

只能在构建脚本中使用

插件 {} 块目前只能在项目的构建脚本中使用。它不能在脚本插件、settings.gradle 文件或初始化脚本中使用。

未来版本的 Gradle 将移除此限制。

所以现在不可能这样做。

有一种解决方法可以提取插件版本并在之后使用它,但我个人觉得它很丑,更喜欢使用显式版本。

相关内容

  • 没有找到相关文章

最新更新