当前位置: 首页 > 知识库问答 >
问题:

包含Gradle Kotlin DSL脚本

易博文
2023-03-14
    null
    null

结果(只是基于我的例子):

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

我试图用Gralde KTS复制同样的东西,并收到以下困难:

    null
apply plugin: 'kotlin'

compileKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

compileTestKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}
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
}
    null

其他链接:

  • 插件应用的Gradle KTS问题。
  • 共享常数提取的Gradle KTS问题。

共有1个答案

谢骏奇
2023-03-14

目前的Kotlin DSL(5.3)中存在一些限制,无法在任何地方进行编译时检查。为了让Kotlin DSL工作,它必须在Gradle API的基础上添加扩展,但它不能神奇地做到这一点。首先,你需要通过Kotlin DSL入门页来理解它。

我如何提取插件应用到包括脚本(以避免梯度模块脚本过载)?

做到这一点的一种方法是使用预先编译的构建脚本与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")
}
 类似资料:
  • 问题内容: 我参与了一个将项目从Oracle迁移到MySQL的项目。在Oracle中,当通过命令行运行批处理时,我能够创建一个引用或包含其他外部SQL脚本文件的SQL脚本。我有一个名为CreateAllTables.sql的脚本,在内部看起来像这样: 我已经知道MySQL命令行“源”命令,但是我的目标是通过一个命令行调用来调用一个包含其他脚本的主.sql脚本文件,如下所示: 所以我的问题是我该如何

  • 问题内容: 我是新手,以前从未使用过PHP。我想从Linux上的HTML文件执行PHP脚本。我需要做什么? 这是我的HTML文件的内容: 问题答案: 您收到什么输出?它只是显示PHP代码吗? 我认为是这样。 为了进行测试,请将文件扩展名更改为,然后再次运行。现在可以用吗? 如果是这样,您将需要将PHP与服务器上的和文件关联。 编辑 这是您要添加到Apache配置中的行:

  • 我对Groovy很陌生,我想从主groovy脚本中的另一个groovy脚本中导入一个类。我已经看到了这篇文章。但是由于环境限制,我不能使用GroovyClassLoader之类的函数或导入任何库/框架。我唯一的可能性是使用评估方法。 我试过这个: 主脚本(评估不会抛出任何错误) Csvreader脚本 但是,我需要通过evaluate调用传递参数(并将方法移到类之外),或者需要创建类的实例。不幸的

  • 我有一些库脚本:lib1。groovy: lib2.groovy: lib3.groovy: 并希望在另一个脚本中使用它们:conf.groovy: conf.groovy是由用户配置的,他不知道我的后台lib脚本!他只知道提供的方法/任务:a()、b()、c()。实际上,我创建lib脚本是为了简化用户。 有没有办法将lib目录中的所有脚本(脚本lib1、lib2m、lib3)都包含到conf.g

  • 问题内容: 我有一个需要在jar中存储库的常规脚本。如何将其添加到类路径?我希望脚本是可执行的,所以我在脚本的顶部使用。 问题答案: 如果确实需要,还可以在运行时通过以下方式加载JAR:

  • 问题内容: 在JDK6中,是否有一种方法可以加载一个文件中的每个脚本,并让一个脚本引用另一个脚本的方法?有点像“包含”? 问题答案: 我认为您正在追求Rhino的全局对象/范围的load()方法/属性 这将加载一个javascript源文件,类似于PHP中include / require的方式。加载文件后,您就可以调用和运行或使用加载的文件中定义的任何对象。 这是我使用Rhino shell时的