【问题标题】:How to get ext.* variables into plugins block in build.gradle.kts如何将 ext.* 变量放入 build.gradle.kts 中的插件块中
【发布时间】:2023-03-07 21:09:01
【问题描述】:

我的构建文件如下所示:

val nexusBaseUri: String by extra
val gradle_version: String by extra
val kotlin_version: String by extra

buildscript {
    val nexusBaseUri by extra { "https://mynexusserver/nexus" }
    val gradle_version by extra { "4.1" }
    val kotlin_version by extra { "1.1.4-3" }
    val springBoot_version by extra { "2.0.0.M3" }

    repositories {
        maven { url = uri("$nexusBaseUri/repository/public") }
        jcenter()
        maven { url = uri("http://repo.spring.io/snapshot") }
        maven { url = uri("http://repo.spring.io/milestone") }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:$springBoot_version")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version")
        classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlin_version")
    }
}

plugins {
    application
    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    // the following line causes a problem
    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    kotlin("jvm", kotlin_version)
}

apply {
    plugin("kotlin-spring")
    plugin("org.springframework.boot")
    plugin("io.spring.dependency-management")
}

application {
    mainClassName = "eqip.fid.FdmlInterpreterDeveloperAppKt"
}

repositories {
    maven { url = uri("$nexusBaseUri/content/groups/public") }
    jcenter()
    maven { url = uri("http://repo.spring.io/snapshot") }
    maven { url = uri("http://repo.spring.io/milestone") }
}

dependencies {
    compile(kotlin("stdlib"))
    compile("org.springframework.boot:spring-boot-starter-web")
}

tasks {
    "wrapper"(Wrapper::class) {
        gradleVersion = gradle_version
    }
}

我在 IntelliJ IDEA 中遇到的错误是

'val kotlin_version: String' 不能在此上下文中被隐式接收器调用。必要时使用显式的

我该如何解决这个问题?

【问题讨论】:

标签: gradle kotlin gradle-kotlin-dsl


【解决方案1】:

您可以在 plugins 内定义一个版本,然后使该版本在块外可访问,例如在dependencies 部分。

plugins {
    kotlin("jvm").version("1.1.61")
}

//This is necessary to make the version accessible in other places
val kotlinVersion: String? by extra {
    buildscript.configurations["classpath"]
            .resolvedConfiguration.firstLevelModuleDependencies
            .find { it.moduleName == "kotlin-gradle-plugin" }?.moduleVersion
}

dependencies {
    compile(kotlin("stdlib", kotlinVersion))
}

对于 1.2+ 版本,您必须替换为 kotlin-gradle-plugin org.jetbrains.kotlin.jvm.gradle.plugin

【讨论】:

  • 看起来不错,但为我返回 null:/
  • @Xerus 你用的是什么版本?
  • 1.2.20,最新版本。 moduleName 现在似乎是 org.jetbrains.kotlin.jvm.gradle.plugin - 当我使用它时它再次工作
【解决方案2】:

我一直在围绕项目 buildscript 块内部和外部定义属性进行一些测试,但它似乎不起作用。如果您想访问与依赖项相关的属性,工作和推荐的解决方案是定义一个 buildSrc 模块 (check this github repo),然后添加一个具有所需属性(版本、字符串...)的 Kotlin 文件/类。比如:

object Dependency {

    object Foundation {

        const val KOTLIN = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${Version.Global.KOTLIN}"
        const val RANDOM_VERSION = "1.2.3"
    }

如果我没记错的话,您可以访问 buildSrc 模块中声明的任何内容,因为其中声明的组件在初始化阶段会被解析。用法示例如下:

plugins {
    val kotlin = Dependency.Foundation.KOTLIN
    kotlin("kapt").version(Dependency.Foundation.RANDOM_VERSION)
}

更多信息here

【讨论】:

    【解决方案3】:

    UPD 不起作用,很抱歉造成混淆。

    原答案:

    --

    另一种解决方法是使用const val 编译时常量:

    object Defs {
        const val kotlinVersion = "1.2.60"
    }
    
    buildscript {
        val kotlinVersion:String by extra { Defs.kotlinVersion }
    }
    
    plugins {
        kotlin("jvm") version Defs.kotlinVersion
    }
    

    【讨论】:

    • 这会导致 Gradle 错误:脚本编译错误:第 10 行:val kotlinVersion:String by extra { Defs.kotlinVersion } ^ 未解决的参考:Defs 1 错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多