Gradle Kotlin DSL 等同于 Groovy DSL 'run'?

Gradle Kotlin DSL equivalent for Groovy DSL 'run'?

我正在尝试使用 Gradle,按照说明 here,使用 Kotlin 和 Java 11 构建一个简单的 JavaFX 11 程序。但是,此页面使用 Gradle 的 Groovy DSL,而我正在尝试使用 Kotlin DSL。令人惊讶的是,我的 Google 搜索没有找到将每个 Groovy 构造映射到其等效 Kotlin 构造或一般解释如何将 Groovy DSL 代码转换为等效 Kotlin DSL 代码的文档。 (这似乎是 Gradle 文档中的一个重大疏忽!)。

特别是,本文档包含以下 Groovy 代码:

compileJava {
    doFirst {
        options.compilerArgs = [
            '--module-path', classpath.asPath,
            '--add-modules', 'javafx.controls'
        ]
    }
}

run {
     doFirst {
         jvmArgs = [
             '--module-path', classpath.asPath,
             '--add-modules', 'javafx.controls'
         ]
    }
}

据我所知,与第一部分等效的 Kotlin 似乎是:

tasks.withType<JavaCompile> {
    options.compilerArgs.addAll(arrayOf(
        "--module-path", classpath.asPath,
        "--add-modules", "javafx.controls"
    ))
}

然而,我一直无法弄清楚相当于第二部分的 Kotlin DSL 是什么。请注意,'run' 是 Kotlin 标准库中的标准函数扩展,因此看起来这段代码的 Kotlin 版本可以在 Kotlin DSL 中出于相同目的使用名称 'run'。

(注意:我考虑尝试使用插件来支持 JavaFX(例如 页面所述),但该插件使用起来似乎相当复杂,我这个项目的复杂性已经够多了,我犹豫要不要在其中引入一个非常简单的文档化开源插件。我真的想在[中制作最简单的"Hello, World"程序=32=] 目前,这似乎出奇地困难。)。

如有任何帮助,我们将不胜感激。

Surprisingly, my Google searches have not turned up a document that maps each Groovy construct to its equivalent Kotlin construct or explains in general how to convert Groovy DSL code to equivalent Kotlin DSL code.

请查看 https://guides.gradle.org/migrating-build-logic-from-groovy-to-kotlin/ and esp. the Configuring tasks 部分。据此,我认为 Kotlin DSL 等价物是

tasks.named<JavaExec>("run").doFirst {
    jvmArgs = listOf('--module-path', classpath.asPath, '--add-modules', 'javafx.controls')
}

使用配置回避API,相当于第二块是:

tasks.named<JavaExec>("run") {
    doFirst {
        jvmArgs = listOf("--module-path", classpath.asPath,"--add-modules", "javafx.controls")
    }
}

关键是 运行 有 JavaExec 类型,就像任何任务的类型一样,可以通过创建一个任务来打印任务的 class 来发现你然后 运行:

tasks.register("getName") {
    doFirst {
        print("Class name: ${tasks["run"].javaClass}")
    }
}

请注意,随着 JavaFX 应用程序的增长,您将需要像这样指定额外的模块:

tasks.named<JavaExec>("run") {
    doFirst {
        jvmArgs = listOf("--module-path", classpath.asPath,
            "--add-modules", "javafx.base,javafx.controls,javafx.graphics")
    }
}

使用Gradle 5.0和kotlin-dsl 1.0,插件注册或创建的任务可以通过tasks容器静态访问(TaskContainer. There is this example provided in the release notes:

plugins {
    java
}

tasks {
    named<Test>("test") {
        testLogging.showStacktraces = true
    }
}

you can now write:

plugins {
    java
}

tasks {
    test {
        testLogging.showStacktraces = true
    }
}

对于您的示例,您很可能使用 application plugin, which registers the run task so you can configure it in a similar matter. One issue to be aware of is that run clashes with the Kotlin stdlib run method so you need to apply some workaround to make sure it gets invoked (see gradle/kotlin-dsl/issues/1175)

tasks {
  compileJava {
    doFirst {
      jvmArgs = listOf("--module-path", classpath.asPath,
          "--add-modules", "javafx.base,javafx.controls,javafx.graphics")
    }
  }

  (run) {
    doFirst {
      jvmArgs = listOf(
        "--module-path", classpath.asPath,
        "--add-modules", "javafx.controls"
      )
    }
  }
}

其他答案显示了如何使用名称、类型或组合来查询容器的特定任务。