23

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

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我不介意使用它,但只是想知道。

4

2 回答 2

13

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

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...

于 2020-08-12T03:14:07.523 回答
10

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

«plugin version» 和 «plugin id» 必须是常量、文字、字符串

以下段落中还有一些与您的问题相关的其他说明:

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

只能在构建脚本中使用

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

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

所以现在不可能做到这一点。

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

于 2018-01-04T16:56:37.777 回答