【问题标题】:Why I cannot access project properties in "plugins" section of build.gradle.kts with Gradle Kotlin DSL (5.0)?为什么我无法使用 Gradle Kotlin DSL (5.0) 访问 build.gradle.kts 的“插件”部分中的项目属性?
【发布时间】:2019-05-01 20:04:17
【问题描述】:

Gradle 5.0,Kotlin DSL

创建gradle.properties 文件:

kotlinVersion=1.3.10

创建build.gradle.kts 文件:

val kotlinVersion: String by project

println(kotlinVersion) // works

plugins {
    kotlin("jvm").version(kotlinVersion)
    //                    ^ Unresolved reference: kotlinVersion

}

repositories {
    jcenter()
}

tasks.register("compute") {
    doLast {
        println(kotlinVersion) // works
    }
}

运行gradle compute,然后更改

kotlin("jvm").version(kotlinVersion)

kotlin("jvm").version("1.3.10")

然后再次运行。一切正常。

我是不是做错了什么?还是某种限制或错误?

我只是想将 Kotlin 版本从构建脚本中移出,这样我以后可以尝试更改它(例如通过命令行,... -PkotlinVersion=1.3.0),并且还保持依赖项和插件的相同。

【问题讨论】:

    标签: gradle kotlin build.gradle gradle-kotlin-dsl


    【解决方案1】:

    可以通过以下方式访问属性:

    project.properties["kotlinVersion"]
    

    【讨论】:

      【解决方案2】:

      我通常使用buildSrc 目录来定义代表我希望重用的版本或属性的对象,尤其是当我有多个项目或多个依赖项与版本控制保持同步时。我整理了一个小示例项目here 来演示用法。

      buildSrc/src/main/kotlin/Versions.kt 我有:

      object Versions {
          // Library versions
          val Kotlin = "1.3.10"
          val logback = "1.2.3"
      
          // Plugin versions
          object Plugins {
              // Can be changed if we want to use a version other than one matching the library version
              val Kotlin = Versions.Kotlin
          }
      }
      

      我在其他地方也这样使用它:

      plugins {
          kotlin("jvm") version Versions.Plugins.Kotlin
      }
      
      // snip...
      
      dependencies {
          compile(kotlin("stdlib-jdk8"))
          compile(group = "ch.qos.logback", name = "logback-classic", version = Versions.logback)
      }
      

      这些是在Versions.kt 文件中静态定义的,但您也可以从环境、文件或属性中读取它们。真正的关键是,您的buildSrc其他所有内容之前进行评估,因此它可用于构建脚本中的所有其他阶段(至少我尝试过的所有阶段!) .

      【讨论】:

      • 一个好处是您可以将编译后的类包含到应用程序中,以便在运行时获得此信息。
      • 没想到!可能比创建所有依赖项和版本的文件(例如)的 gradle 任务更符合人体工程学。
      【解决方案3】:

      正如@yole 在他的回答中所说,plugins { ... } 块是一种特殊构造,在构建脚本的其余部分之前进行评估,并且对 Gradle 模型的访问权限有限。

      传递属性并在plugins { ... } DSL 中使用它的一种方法是使用system properties

      val kotlinVersion = System.getProperty("kotlinVersion")?.toString() 
          ?: error("Add a 'kotlinVersion' system property or pass -DkotlinVersion=...")
      id("org.jetbrains.kotlin.multiplatform").version(kotlinVersion)
      

      通过命令行传递系统属性的方式是-DkotlinVersion=1.3.0

      【讨论】:

      • 这不能使用-P 代替-D 参数吗?
      • @mochadwi,在最近的 Gradle 版本中,您可以在 settings.gradle.kts 中使用 pluginManagement 管理插件版本,并且您可以在那里使用项目属性,请参阅:docs.gradle.org/current/userguide/…
      【解决方案4】:

      plugins 块与构建脚本的其余部分分开评估,因为您使用的插件集决定了构建脚本的其余部分的类路径(和名称解析范围)。因此,plugins 块之外的声明不能在该块内使用。

      【讨论】:

      • 有没有办法将该版本外部化?
      猜你喜欢
      • 2018-12-19
      • 1970-01-01
      • 2018-07-14
      • 2022-06-21
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      相关资源
      最近更新 更多