我在使用Maven之前使用了Gradle和Maven之类的东西,例如dependencyManagement和pluginManagement,它允许在“属性”的帮助下将所有版本“DRY”保存在一个地方。
Gradle支持项目属性,因此我可以声明以下版本:
buildscript {
ext.kotlin_version = '1.1.61'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
但这种方法无法应用于plugins {} DSL。我不能写这样的东西:
plugins {
id 'org.jetbrains.kotlin:kotlin-gradle-plugin' version $kotlin_version
}
根据文件:
值必须是文字的(例如常量字符串,而不是变量)
有没有办法解决这个限制?
答案 0 :(得分:1)
我认为您可以将ext
闭包放在单独的properties.gradle
中,然后在buildscript
以及project
版本buildscript
中引用属性两次} block在开始时,在groovy脚本的任何其他部分之前进行评估)。
例如,在$projectRoot/gradle/properties.gradle
中,如下所示:
ext {
kotlinVersion = '1.1.61' // NOTE, the naming convention is better with kotlinVersion instead of kotlin_version
}
你的$projectRoot/build.gradle
看起来像这样:
buildscript {
apply from: "gradle/properties.gradle"
repositories {
jcenter()
}
dependencies {
println "In buildscript, kotlinVersion is $kotlinVersion"
}
}
apply plugin: 'java'
apply from: "gradle/properties.gradle"
repositories {
jcenter()
}
dependencies {
println "In project, kotlinVersion is $kotlinVersion"
}
当您运行./gradlew dependencies
时,它会显示已填充的版本:
> Configure project :
In buildscript, kotlinVersion is 1.1.61
In project, kotlinVersion is 1.1.61
答案 1 :(得分:0)
最新版本的Gradle允许您在属性文件中定义版本,在pluginManagement
块中映射该版本,然后从所有下游plugin
块中忽略该版本。 pluginManagement块没有only-constant
限制。
实际上,一旦使用这种方法,甚至尝试向下游声明版本都是编译时错误。
使用这种方法后,很有可能完全省略构建脚本。
gradle.properties
kotlinVersion=1.3.50
settings.gradle
pluginManagement {
resolutionStrategy {
eachPlugin {
if (requested.id.id == "org.jetbrains.kotlin.jvm") {
useVersion(kotlinVersion)
}
}
}
}
build.gradle
plugins {
id("org.jetbrains.kotlin.jvm")
}
如果您喜欢kotlinscript,请从代表那里获取您的版本:
settings.gradle.kts
val kotlinVersion: String by settings
pluginManagement {
resolutionStrategy {
eachPlugin {
if (requested.id.id == "org.jetbrains.kotlin.jvm") {
useVersion(kotlinVersion)
}
}
}
}
当然,您不需要属性文件。您可以在gradle.settings中对版本进行硬编码。但是通过拥有该属性,您可以使用它声明对stdlib的依赖关系。