Gradle 在自定义 运行 任务中创建参数
Gradle create args in custom run tasks
我是 Gradle 的新手,我肯定遗漏了一些东西,但这个基本问题对我来说还是个谜。
我正在尝试创建多个自定义任务,将 Gradle 'run' 从应用程序插件中包装起来,其中根据自定义任务的需要在其中创建一个或多个参数。
我不想从 CLI* 传递参数,我希望在 运行-wrapping Gradle 任务中创建这些参数。
让我们看一下我正在努力实现的目标的使用示例:
// Main.kt
fun main(args: Array<String>) {
for (a in args)
println("$a ") // prints 'env1' or 'env2 5' (see gradle.build)
}
// gradle.build, unworking attempt 1
gradle.registerTask("customA") {
description = "run wrapper 1"
doFirst {
gradle.run.configure {
systemProperty("-Dtask", "env1")
}
}
finalizedBy("run")
}
// gradle.build, unworking attempt 2
gradle.registerTask("customB") {
description = "run wrapper 2"
args = listOf("env2", "5")
finalizedBy("run")
}
// Then use as
./gradlew customA
// Essentially I want the above command to be equal to ./gradlew run --args=['env2', '5']
该程序不是 Spring Boot,它是一个小的 kotlin 项目。因此,我希望它 运行 作为一个程序,而不是一个 jar。不幸的是,每当我使用 'args' 属性,Gradle 开始寻找一个 jar,想不出办法解决它。
第一个选项(customA 任务)没有在 main 的 args 列表中提供参数,但我想它可以通过 getProperty() 访问,这不满足我的要求。
你能告诉我做我想做的事情的正确方法吗?
* 有很多关于如何做到这一点的话题
您的第一次尝试是设置系统 属性,而不是应用程序参数。您的第二次尝试是设置 customB
任务的参数,而不是 run
任务的参数。对于您想要的可能有更好的方法,但以下方法似乎有效:
Main.kt
fun main(args: Array<String>) = println(args.contentToString())
build.gradle.kts (Kotlin DSL):
plugins {
kotlin("jvm") version "1.5.20"
application
}
application {
mainClass.set("MainKt")
}
repositories {
mavenCentral()
}
dependencies {
implementation(kotlin("stdlib"))
}
tasks {
val run by existing(JavaExec::class)
register("customA") {
doFirst {
run.configure {
args = listOf("Hello", "World!")
}
}
finalizedBy(run)
}
register("customB") {
doFirst {
run.configure {
args = listOf("Goodbye", "World!")
}
}
finalizedBy(run)
}
}
通过以上我得到以下输出:
Executing
Output
./gradlew customA
[Hello, World!]
./gradlew customB
[Goodbye, World!]
我是 Gradle 的新手,我肯定遗漏了一些东西,但这个基本问题对我来说还是个谜。
我正在尝试创建多个自定义任务,将 Gradle 'run' 从应用程序插件中包装起来,其中根据自定义任务的需要在其中创建一个或多个参数。 我不想从 CLI* 传递参数,我希望在 运行-wrapping Gradle 任务中创建这些参数。
让我们看一下我正在努力实现的目标的使用示例:
// Main.kt
fun main(args: Array<String>) {
for (a in args)
println("$a ") // prints 'env1' or 'env2 5' (see gradle.build)
}
// gradle.build, unworking attempt 1
gradle.registerTask("customA") {
description = "run wrapper 1"
doFirst {
gradle.run.configure {
systemProperty("-Dtask", "env1")
}
}
finalizedBy("run")
}
// gradle.build, unworking attempt 2
gradle.registerTask("customB") {
description = "run wrapper 2"
args = listOf("env2", "5")
finalizedBy("run")
}
// Then use as
./gradlew customA
// Essentially I want the above command to be equal to ./gradlew run --args=['env2', '5']
该程序不是 Spring Boot,它是一个小的 kotlin 项目。因此,我希望它 运行 作为一个程序,而不是一个 jar。不幸的是,每当我使用 'args' 属性,Gradle 开始寻找一个 jar,想不出办法解决它。 第一个选项(customA 任务)没有在 main 的 args 列表中提供参数,但我想它可以通过 getProperty() 访问,这不满足我的要求。
你能告诉我做我想做的事情的正确方法吗?
* 有很多关于如何做到这一点的话题
您的第一次尝试是设置系统 属性,而不是应用程序参数。您的第二次尝试是设置 customB
任务的参数,而不是 run
任务的参数。对于您想要的可能有更好的方法,但以下方法似乎有效:
Main.kt
fun main(args: Array<String>) = println(args.contentToString())
build.gradle.kts (Kotlin DSL):
plugins {
kotlin("jvm") version "1.5.20"
application
}
application {
mainClass.set("MainKt")
}
repositories {
mavenCentral()
}
dependencies {
implementation(kotlin("stdlib"))
}
tasks {
val run by existing(JavaExec::class)
register("customA") {
doFirst {
run.configure {
args = listOf("Hello", "World!")
}
}
finalizedBy(run)
}
register("customB") {
doFirst {
run.configure {
args = listOf("Goodbye", "World!")
}
}
finalizedBy(run)
}
}
通过以上我得到以下输出:
Executing | Output |
---|---|
./gradlew customA |
[Hello, World!] |
./gradlew customB |
[Goodbye, World!] |