Gradle:在多项目构建中管理依赖项/插件版本
在Gradle之前,我曾与Maven合作过,Maven拥有dependencyManagement和pluginManagement等功能,可以借助“属性”在一个地方保持所有版本的“干燥” Gradle支持项目属性,因此我可以声明如下版本:Gradle:在多项目构建中管理依赖项/插件版本,gradle,dry,multi-project,Gradle,Dry,Multi Project,在Gradle之前,我曾与Maven合作过,Maven拥有dependencyManagement和pluginManagement等功能,可以借助“属性”在一个地方保持所有版本的“干燥” Gradle支持项目属性,因此我可以声明如下版本: buildscript { ext.kotlin_version = '1.1.61' repositories { mavenCentral() } dependencies { class
buildscript {
ext.kotlin_version = '1.1.61'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
但这一方法不能应用于其他国家。我不能写这样的东西:
plugins {
id 'org.jetbrains.kotlin:kotlin-gradle-plugin' version $kotlin_version
}
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"
}
根据文件:
值必须是文字(例如常量字符串,而不是变量)
有没有办法绕过这个限制?我认为您可以将
ext
闭包放在一个单独的属性.gradle
中,然后在构建脚本
和项目
构建中引用属性两次(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
如下所示:
plugins {
id 'org.jetbrains.kotlin:kotlin-gradle-plugin' version $kotlin_version
}
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
Gradle的最新版本允许您在属性文件中定义版本,在
pluginManagement
块中映射该版本,然后从所有下游plugin
块中省略该版本。pluginManagement块不具有唯一常量
限制
事实上,一旦使用这种方法,甚至尝试在下游声明版本都是编译时错误
使用这种方法后,很有可能完全省略构建脚本
格拉德尔酒店
kotlinVersion=1.3.50
格雷德尔酒店
pluginManagement {
resolutionStrategy {
eachPlugin {
if (requested.id.id == "org.jetbrains.kotlin.jvm") {
useVersion(kotlinVersion)
}
}
}
}
格雷德尔先生
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的依赖关系。这并不能解决
plugins{}
DSL的问题。我无法编写:plugins{id'org.jetbrains.kotlin:kotlin gradle plugin'version$kotlinVersion}
@AlexL.您无法将变量放入插件{}
,它必须是字符串文字。也许我需要考虑不同的问题。我不想复制/粘贴版本并将其保留在两个位置。可能有类似常量的东西吗?是的,我想我提供的方法可能是最佳可行的选择。您的IDE可能不喜欢它,但您实际上可以这样做:val kotlin_version:string by rootProject.ext'insine插件块很好,而且您希望做
version kotlin_version`(no$
symbol)比简单地做buildscript{extra.set(“kotlinVersion”,“1.3.61”)}插件{kotlin(“jvm”)version rootProject.extra[“kotlinVersion”]}