Gradle:管理多项目构建中的依赖项/插件版本

时间:2017-12-31 14:46:42

标签: gradle dry multi-project

我在使用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
}

根据文件:

  

值必须是文字的(例如常量字符串,而不是变量)

有没有办法解决这个限制?

2 个答案:

答案 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的依赖关系。