繁体   English   中英

包含Gradle Kotlin DSL的脚本

[英]Include scripts with Gradle Kotlin DSL

我正在尝试在项目中使用带有gradle的Kotlin DSL,但有以下限制:

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

我们对Groovy的看法:

  • 一些常见配置项被排除在单独的脚本之外。 请查看以下示例。
  • Gradle模块包括这些文件。

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

  • 我们不需要在每个模块中添加相同的代码行。
  • 大多数项目只与依赖列表有区别。

我试图用Gralde KTS重现同样的情况并遇到以下困难:

  • 我无法在include文件中应用插件并在模块中使用它。 在这种情况下,我收到编译错误(因为插件类型没有添加到模块脚本中)。
  • 我无法在常量中提取常量以在每个脚本中使用它们(root build.gradle.kts包括在内)。 使用Groovy我可以使用像springBootVersion这样的springBootVersion ,但是使用Kotlin Script我必须在每个模块文件中创建相同的属性。
  • 如果没有公共存储库访问, 预编译的脚本插件就无法工作(例如,我无法配置常见的脚本文件,只需使用默认的嵌入式Kotlin Script版本,从这些URL下载所有依赖项:...“)。

包含文件样本:

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模块脚本过载)?
  • 如何在没有公共全局存储库访问的情况下使用预编译的脚本插件

其他链接:

Kotlin DSL目前(5.3)存在限制,无法在任何地方进行编译时检查。 为了使Kotlin DSL能够工作,它必须在Gradle API之上添加扩展,并且不能神奇地做到这一点。 首先,您需要通过Kotlin DSL Primer页面来理解它。

如何提取适用于包含脚本的插件(以避免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")
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM