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

在Gradle之前,我曾与Maven合作过,Maven拥有dependencyManagement和pluginManagement等功能,可以借助“属性”在一个地方保持所有版本的“干燥”

Gradle支持项目属性,因此我可以声明如下版本:

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”]}