Gradle Kotlin DSL:在独特的地方定义Kotlin版本

时间:2017-12-01 07:11:07

标签: gradle kotlin build.gradle gradle-kotlin-dsl

为了描述Gradle构建脚本,我们可以通过build.gradle.kts文件使用Kotlin。在dependencies以及构建plugin部分中全局定义 Kotlin版本是一个常见问题(相对而言)对于给定的案例,不常使用不同的版本。)

考虑以下代码(Gradle 4.3.1):

plugins {
    var pluginVersion = "1.2.30"
    kotlin("jvm").version(kotlinVersion)
    // more
}

var dependencyVersion = "1.2.30"
dependencies {
    compile(kotlin("stdlib", kotlinVersion))
    compile(kotlin("reflect", kotlinVersion))
    testCompile(kotlin("test", kotlinVersion))
    // more
}

正如您所看到的,kotlin version(本例中为1.2.30)定义为两次dependencyVersionpluginVersion,这通常是没有差异。由于DSL限制,无法从pluginVersion块外部访问plugins或从dependencyVersion块中访问plugins

如何将版本字符串"1.2.30"提取到一个地方?

6 个答案:

答案 0 :(得分:11)

在Gradle的更高版本中,您不再需要指定kotlin(stdlib|reflect|test)依赖项的版本,Kotlin插件会自动为您配置它们。

至于将依赖项提取到一个地方,有两种主要模式:

  • 定义要在buildSrc/src/main/kotlin/内的对象中共享的常量,并在构建脚本中使用该对象,来自buildSrc的代码可用于整个脚本,包括plugins块< / LI>
  • 使用系统属性,您可以在gradle.properties中定义一个系统属性,方法是在其名称前加上systemProp.,然后您可以通过System.getProperties()访问系统属性,例如:< / p>

    // build.gradle.kts
    plugins {
      val kotlinVersion by System.getProperties()
      println("Kotlin version is $kotlinVersion")
    }
    
    // gradle.properties
    systemProp.kotlinVersion=1.2.20
    

答案 1 :(得分:5)

您可以从插件类中提取版本:

import org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper

plugins {
    kotlin("jvm") version "1.2.0"
}

val kotlinVersion = plugins.getPlugin(KotlinPluginWrapper::class.java).kotlinPluginVersion

答案 2 :(得分:2)

@ s1m0nw1评论的答案(评论太长): 不,您不能在buildSrc / build.gradle中使用buildSrc / src内容。我在编写基于Android的插件时遇到了这个问题,并且在buildsSrc中需要android gradle插件依赖,但我也在项目中声明了此依赖。所以我有两个不同的地方要维护两个版本。

我通过在buildSrc目录中创建gradle.properties文件来解决此问题。 在其中,我创建了道具androidGradlePluginVersion=3.6.0-rc02

buildSrc / build.gradle:

val androidGradlePluginVersion: String by project
dependencies {
    implementation("com.android.tools.build:gradle:$androidGradlePluginVersion")

buildSrc / src /.../ Versions.kt:

var ANDROID_PLUGIN = loadAndroidGradlePluginVersion()

用于道具:

val GRADLE_PROPERTIES = "buildSrc/gradle.properties"
val ANDROID_PLUGIN_VERSION_PROP = "androidGradlePluginVersion"

fun loadAndroidGradlePluginVersion(): String {
    Properties().apply { load(FileInputStream(GRADLE_PROPERTIES)) }.let {
        return it.getProperty(ANDROID_PLUGIN_VERSION_PROP)
    }

    error("Provide $ANDROID_PLUGIN_VERSION_PROP in $GRADLE_PROPERTIES")
} 

答案 3 :(得分:1)

有一种可用的解决方法,可以搜索为 kotlin插件定义的版本,并将此一个分配给外部变量。以下内容证明了这一点:

val kotlinVersion: String? by extra {
    buildscript.configurations["classpath"]
            .resolvedConfiguration.firstLevelModuleDependencies
            .find { it.moduleName == "kotlin-gradle-plugin" }?.moduleVersion
}

plugins {
    kotlin("jvm").version("1.2.30")
    //more
}

然后可以在kotlinVersion中使用变量dependencies而不会出现进一步的麻烦。

答案 4 :(得分:1)

我偶然发现的是在build.gradle.kts中使用Kotlin类。

我必须:

  • 创建一个名为buildSrc并在其根中包含src/main/kotlin的模块。
  • build.gradle.kts中的{li> include("buildSrc")

settings.gradle.kts非常小:

buildSrc/build.gradle.kts

plugins { `kotlin-dsl` } repositories { jcenter() } 中,我添加了一个buildSrc/src/main/kotlin

Config.kt

还有一个const val GROUP_ID = "my-company" const val VERSION = "0.1.0-SNAPSHOT" const val POM_NAME = "my-library-name" const val POM_DESCRIPTION = "A library doing stuff." const val POM_URL = "https://github.com/${GROUP_ID}/${POM_NAME}/" const val POM_SCM_URL = POM_URL const val POM_SCM_CONNECTION = "scm:git:git://github.com/${GROUP_ID}/${POM_NAME}.git" const val POM_SCM_DEV_CONNECTION = "scm:git:ssh://git@github.com/${GROUP_ID}/${POM_NAME}.git" const val POM_LICENCE_NAME = "The Apache Software License, Version 2.0" const val POM_LICENCE_URL = "http://www.apache.org/licenses/LICENSE-2.0.txt" const val POM_LICENCE_DIST = "repo" const val POM_DEVELOPER_ID = "me" const val POM_DEVELOPER_NAME = "meeee" const val POM_DEVELOPER_EMAIL = "me@foo.com"

Dependencies.kt

所以我可以在根@file:Suppress("MemberVisibilityCanBePrivate") object Jvm { const val version = "1.8" } object Kotlin { const val version = "1.3.50" const val stdlibJdk8 = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$version" const val jvmId = "jvm" const val kaptId = "kapt" } object MavenPublish { const val id = "maven-publish" } object Arrow { const val version = "0.10.1" const val core = "io.arrow-kt:arrow-core:$version" const val syntax = "io.arrow-kt:arrow-syntax:$version" const val optics = "io.arrow-kt:arrow-optics:$version" const val fx = "io.arrow-kt:arrow-fx:$version" const val meta = "io.arrow-kt:arrow-meta:$version" } object Versions { const val version = "0.27.0" const val versions = "com.github.ben-manes:gradle-versions-plugin:$version" const val id = "com.github.ben-manes.versions" } 中使用它

build.gradle.kts

对此我感到很满意,但是当它降低以自动递增import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { kotlin(Kotlin.jvmId) version Kotlin.version kotlin(Kotlin.kaptId) version Kotlin.version id(Versions.id) version Versions.version id(MavenPublish.id) } group = GROUP_ID version = VERSION repositories { mavenCentral() jcenter() } dependencies { implementation(Kotlin.stdlibJdk8) implementation(Arrow.core) implementation(Arrow.syntax) kapt(Arrow.meta) } tasks.withType<KotlinCompile> { kotlinOptions.jvmTarget = Jvm.version } publishing { publications { create<MavenPublication>("mavenJava") { @Suppress("UnstableApiUsage") pom { name.set(POM_NAME) description.set(POM_DESCRIPTION) url.set(POM_URL) licenses { license { name.set(POM_LICENCE_NAME) url.set(POM_LICENCE_URL) distribution.set(POM_LICENCE_DIST) } } developers { developer { id.set(POM_DEVELOPER_ID) name.set(POM_DEVELOPER_NAME) email.set(POM_DEVELOPER_EMAIL) } } scm { connection.set(POM_SCM_CONNECTION) developerConnection.set(POM_SCM_DEV_CONNECTION) url.set(POM_SCM_URL) } } } } } 时,我可能会后退以将其保持在version中。

答案 5 :(得分:0)

一旦您为 Kotlin 插件定义了一个版本,所有其他 Kotlin 库都将使用相同的版本,并且不需要特定的版本集。

所以唯一需要设置版本的地方是定义插件的类路径时,例如:

buildscript {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }

    dependencies {
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21")
    }
}

如果您需要该版本用于其他目的(例如在 resolutionStrategy 中或仅供参考),您可以从 org.jetbrains.kotlin.config.KotlinCompilerVersion.VERSION

例如:

println("Kotlin version used is ${org.jetbrains.kotlin.config.KotlinCompilerVersion.VERSION}")