如何将 ext.* 变量放入 build.gradle.kts 中的插件块中
Posted
技术标签:
【中文标题】如何将 ext.* 变量放入 build.gradle.kts 中的插件块中【英文标题】:How to get ext.* variables into plugins block in build.gradle.kts 【发布时间】:2018-02-13 15:56:10 【问题描述】:我的构建文件如下所示:
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' 不能在此上下文中被隐式接收器调用。必要时使用显式的
我该如何解决这个问题?
【问题讨论】:
您不能在该部分中使用变量。这个问题已经在***上提出了一个答案,只是想把答案放在这里,以防其他人遇到它。 ***.com/a/37749402/559536 ***.com/a/53594357/3557894 【参考方案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 错误以上是关于如何将 ext.* 变量放入 build.gradle.kts 中的插件块中的主要内容,如果未能解决你的问题,请参考以下文章