Kotlin dsl gradle,如何使用自定义任务在 .kt 中调用和执行函数



我有和应用程序有

fun main() {} 

inside test/kotlin/com.company/LocalApplication.kt

我使用它在本地主机中运行,例如使用 IntelliJ,我只需单击运行该功能即可启动我的应用程序。

该函数在内部测试它为本地主机生成自定义参数配置,然后调用真正的 main/com.company/Application.kt

所以我想在build.gradle.kts中为Kotlin DSL gradle创建一个任务,当我在那个有趣的main((上手动单击运行时,它与Intellij完全相同

例如,在终端中执行以下操作:

gradle localhost

该命令在test/kotlin/com.company/LocalApplication.kt中调用有趣的main(( {},并使用localhost配置启动我的应用程序。

谢谢大家

让我们假设这个非常基本的应用程序App.kt

package com.company
class App {
val greeting: String
get() {
return "Hello world."
}
}
fun main(args: Array<String>) {
println(App().greeting)
}

您可以使用JavaExec任务类型。

定义类型为JavaExec的自定义任务:

tasks.register<JavaExec>("localhost") {
classpath = sourceSets.test.get().runtimeClasspath
main = "com.company.LocalApplication"
}

然后,您需要更新LocalApplication.kt以使用@file:JvmName

@file:JvmName("LocalApplication")
package com.company
fun main(args: Array<String>) {
println(App().greeting)
}

然后在我的终端中运行任务会产生:

$ ./gradlew localhost
> Task :localhost
Hello world.
BUILD SUCCESSFUL in 4s
3 actionable tasks: 3 executed

JavaExec任务还有更多选项,请阅读文档以获取更多信息。

  • https://docs.gradle.org/current/dsl/org.gradle.api.tasks.JavaExec.html
  • https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#handling-signature-clashes-with-jvmname

测试:

------------------------------------------------------------
Gradle 6.1.1
------------------------------------------------------------
Build time:   2020-01-24 22:30:24 UTC
Revision:     a8c3750babb99d1894378073499d6716a1a1fa5d
Kotlin:       1.3.61
Groovy:       2.5.8
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          11.0.6 (AdoptOpenJDK 11.0.6+10)
OS:           Mac OS X 10.15.3 x86_64

最新更新