使用Gradle Kotlin DSL包含脚本

20

我想在具有以下限制的项目中开始使用Kotlin DSL与Gradle:

  • 该项目有不同的模块(而且有时这些模块使用不同的插件,但是如果两个项目使用相同的插件,则插件的版本是相同的)。
  • 该项目只有内部企业存储库(例如,我们不直接使用jcenter,而是使用代理)。

Groovy示例:

  • 某些常见配置项被排除到单独的脚本中。 请查看下面的示例。
  • Gradle模块包括这些文件。

结果(仅基于我的示例):

  • 我们不需要将相同的代码行添加到每个模块中。
  • 大多数项目仅在依赖项列表方面有所不同。

我尝试使用Gradle KTS复制相同的功能,但遇到了以下困难:

  • 我无法在包含的文件中应用插件并在模块中使用它。 在这种情况下,我会收到编译错误(因为插件类型未添加到模块脚本中)。
  • 我无法提取常量到公共位置以在每个脚本中使用它们(包括根build.gradle.kts)。 使用Groovy,我可以像springBootVersion那样使用变量,但是使用Kotlin Script时,我必须在每个模块文件中创建相同的属性。
  • 预编译脚本插件没有公共存储库访问权限(例如,我无法使用想法“只需使用默认嵌入式Kotlin脚本版本,从这些网址下载所有依赖项的通用脚本文件进行配置”)。

包含文件示例:

apply plugin: 'kotlin'

compileKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

compileTestKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

Gradle模块示例:

apply from: "${rootDir}/gradle/include/kotlin-common-include.gradle"

dependencies {
    compile project(':my.project.libraries.common') 

    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springBootVersion
}

问题:

  • 如何将所有通用常量(例如依赖版本)放入单独的文件中,以便通过使用类似于springBootVersionConstants.springBootVersion进行包含,并进行编译时检查?
  • 如何提取应用于包含脚本的插件(以避免Gradle模块脚本过载)?
  • 如何在没有公共全局存储库访问权限的情况下使用预编译脚本插件

附加链接:

1个回答

28

当前(5.3) Kotlin DSL 存在一些限制,使得无法在所有地方进行编译时检查。为了让 Kotlin DSL 工作,它必须在 Gradle API 之上添加扩展,但这并不是魔法。首先您需要阅读 Kotlin DSL 入门指南 页面以了解它。

如何提取应用于 include 脚本的插件(以避免 Gradle 模块脚本过载)?

唯一的方法是使用带有 Kotlin DSL 插件的预编译构建脚本。为此,您需要将脚本移动到$rootDir/buildSrc项目中。以下是可能的样子:

// $rootDir/buildSrc/build.gradle.kts
plugins {
  `kotlin-dsl`
}
repositories {
   maven {
     url = uri("http://host:8082/artifactory/...")
  }
}

然后像这样放置您的通用脚本:

// $rootDir/buildSrc/src/main/kotlin/common.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  kotlin("jvm") version "1.3.21"
}
tasks.compileKotlin {
  kotlinOptions.jvmTarget = "1.8"
}
tasks.compileTestKotlin {
  kotlinOptions.jvmTarget = "1.8"
}

然后,您可以像将此脚本应用于插件一样进行操作:

// $rootDir/build.gradle.kts
subprojects {
  apply(id = "common")
}

如果我没有公共全局存储库访问权限,如何使用预编译的脚本插件?

为预编译的脚本插件配置自定义存储库与您通常的构建脚本没有什么不同。像这样做:

// $rootDir/buildSrc/settings.gradle.kts
pluginManagement {
  repositories.maven {
    url = uri("http://host:8082/artifactory/...")
  }
}

如果您不想使用预编译插件,可以选择配置扩展。您可以按以下方式执行:

// $rootDir/gradle/common.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
tasks.withType<KotlinCompile> {
  kotlinOptions.jvmTarget = "1.8"
}

而在主脚本中:

// $rootDir/build.gradle.kts
subprojects {
  apply {
    plugin(KotlinPlatformJvmPlugin::class)
    from("common.gradle.kts")
  }
}

如何将所有常用常量(如依赖库版本)放入单独的文件中,以便只需使用类似于springBootVersion或Constants.springBootVersion即可进行编译时检查?

目前没有很好的方法来做到这一点。您可以使用额外的属性,但这不会保证编译时检查。像这样的东西:

// $rootDir/dependencies.gradle.kts

// this will try to take configuration from existing ones
val compile by configurations
val api by configurations
dependencies {
  compile("commons-io:commons-io:1.2.3")
  api("some.dep")
}

// This will put your version into extra extension
extra["springBootVersion"] = "1.2.3"

你可以像这样使用它:

// $rootDir/build.gradle.kts
subprojects {
  apply {
    plugin<JavaLibraryPlugin>()
    from("$rootDir/dependencies.gradle.kts")
  }

并且在您的模块中:

// $rootDir/module/build.gradle.kts
// This will take existing dependency from extra
val springBootVersion: String by extra
dependencies {
  compile("org.spring:boot:$springBootVersion")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接