gpt4 book ai didi

java - 使用 Gradle Kotlin DSL 包含脚本

转载 作者:行者123 更新时间:2023-12-01 09:54:24 29 4
gpt4 key购买 nike

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

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

  • 我们在 Groovy 中拥有的功能:
  • 一些常见的配置项被排除在单独的脚本中。请检查下面的示例。
  • Gradle 模块包括这些文件。

  • 结果(仅基于我的示例):
  • 我们不需要在每个模块中添加相同的代码行。
  • 大多数项目仅与依赖项列表有所不同。

  • 我试图用 Gralde KTS 重现相同的内容,但遇到了以下困难:
  • 我无法在包含文件中应用插件并在模块中使用它。在这种情况下,我收到编译错误(因为插件类型未添加到模块脚本中)。
  • 我无法提取常量以在每个脚本中使用它们(根 build.gradle.kts 包括)。使用 Groovy,我可以使用像 springBootVersion 这样的变量,但是对于 Kotlin 脚本,我必须在每个模块文件中创建相同的属性。
  • Precompiled script plugins没有公共(public)存储库访问权限就无法工作(例如,我无法使用“仅使用默认嵌入式 Kotlin 脚本版本,从这些 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
    }

    问题:
  • 我怎样才能将所有常用常量(例如依赖版本)放到单独的文件中,以便仅使用 springBootVersion 之类的东西来包含它们或 Constants.springBootVersion编译时检查?
  • 如何提取应用于包含脚本的插件(以避免 Gradle 模块脚本过载)?
  • 如何使用 precompiled script plugins没有公共(public)全局存储库访问权限?

  • 附加链接:
  • Issue for Gradle KTS for plugin applying .
  • Issue for Gradle KTS for shared constants extracting .
  • 最佳答案

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

    How can I extract plugin applying to the include scripts (to avoid Gradle module scripts overload)?



    一种方法是使用 precompiled build scripts使用 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")
    }

    How can I use precompiled script plugins without public global repositories access?



    为预编译脚本插件配置自定义存储库与您通常的构建脚本没有什么不同。这样做:
    // $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")
    }
    }

    How can I put all common constants (such as dependency versions) to the separate file to include them just by using something like springBootVersion or Constants.springBootVersion with compile-time checks?



    目前没有好的方法可以做到这一点。您可以使用额外的属性,但它不能保证编译时检查。像这样的东西:
    // $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")
    }

    关于java - 使用 Gradle Kotlin DSL 包含脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55335866/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com