无法在插件块中使用项目额外属性

时间:2017-12-07 22:09:43

标签: gradle-kotlin-dsl

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

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

3 个答案:

答案 0 :(得分:3)

根据documentation(参见约束语法小节)

  

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

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

  

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

     

只能在构建脚本中使用

     

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

     

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

所以现在不可能这样做。

有一个workaround来提取插件版本并在之后使用它,但我个人觉得它很难看并且更喜欢使用显式版本。

答案 1 :(得分:1)

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

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确定,这就是我们想要的...

答案 2 :(得分:0)

build.gradle.kts root

buildscript {
  val kotlinVersion by rootProject.extra { "1.3.10" }
  ...
}

build.gradle.kts module

dependencies {
  implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:${rootProject.extra.get("kotlinVersion")}")
}

Official docs