避免类似Gradle任务之间的重复?

避免类似Gradle任务之间的重复?,gradle,Gradle,有没有办法避免同一类型的两个类似任务之间的配置重复 例如,我想创建一个debugSomething任务,其配置与下面的runSomething相同,但在jvmArgs中添加了一个远程调试器参数: task runSomething(dependsOn: jar, type: JavaExec, group: "Run") { jvmArgs "-Xmx1024m", "-XX:MaxPermSize=128m" main = "com.some.Main" classpa

有没有办法避免同一类型的两个类似任务之间的配置重复

例如,我想创建一个
debugSomething
任务,其配置与下面的
runSomething
相同,但在jvmArgs中添加了一个远程调试器参数:

task runSomething(dependsOn: jar, type: JavaExec, group: "Run") {
    jvmArgs "-Xmx1024m", "-XX:MaxPermSize=128m"
    main = "com.some.Main"
    classpath = sourceSets.main.runtimeClasspath
}

参考。AFAICT,它精确地显示了您想要的内容。

这可以使用普通Groovy解决:

task runSomething(dependsOn: jar, type: JavaExec, group: "Run") {
}

task debugSomething(dependsOn: jar, type: JavaExec, group: "Run") {
    jvmArgs "-agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=y"
}

[runSomething, debugSomething].each { task ->
    task.main = "com.some.Main"
    task.classpath = sourceSets.main.runtimeClasspath
    task.jvmArgs "-Xmx1024m", "-XX:MaxPermSize=128m"
}
即使调用了两次
debugSomething.jvmArgs
,所有三个参数都会提供给JVM

可以使用Groovy设置单个参数:


我发现使用
Task.configure
方法对这样的逻辑集中非常有帮助

我还没有测试过,但在您的情况下,这可能是这样的:

def commonSomething = {
    main = "com.some.Main"
    classpath = sourceSets.main.runtimeClasspath
    jvmArgs "-Xmx1024m", "-XX:MaxPermSize=128m"
}

task runSomething(dependsOn: jar, type: JavaExec, group: "Run") {
    configure commonSomething
}

task debugSomething(dependsOn: jar, type: JavaExec, group: "Run") {
    configure commonSomething
    jvmArgs ...add debug arguments...
}

我一直在寻找类似的东西,但有一点不同,我不希望所有相同类型的任务之间共享配置,但只针对其中的一些任务

我试过类似于公认答案中所述的方法,但效果不好。那我再试一次

正如我在这里所说的,我不介意与大家分享,至少现在有一种更好的、Gradle内置的方式来实现这里所要求的目标。它是这样的:

tasks.withType(JavaExec) {
    jvmArgs "-Xmx1024m", "-XX:MaxPermSize=128m"
    main = "com.some.Main"
    classpath = sourceSets.main.runtimeClasspath
}

通过这种方式,
JavaExec
类型的所有任务都将收到默认配置,该配置显然可以被同一类型的任何特定任务更改。

我知道我可以在变量中提取配置,但由于我要设置多个环境和命令行参数,这在我看来并不理想。我希望有一种方法可以重用现有任务定义(现有任务类型),而不是创建一个全新的任务类型,但这确实可以减少一些重复。我创建了一个新的任务类型,在构造函数中设置属性。然而,在这一点上,不可能获得源集,因此仍然会留下一些重复。@DavidPärsson-我是一个新手。。。但是,如果您扩展了要模拟的现有类型(JavaExec)而不是DefaultTask,那么这会满足您的需要吗?抱歉,如果我不清楚,那正是我所尝试的。它适用于配置的静态部分,这至少更好。如果没有更好的解决方案,我会接受你的。我尝试过这样做,但遇到了项目额外属性不可见。我创建了一个新的问题,它似乎与上面的问题有很大的不同:它工作得很好,但是在
commonSomething
闭包中添加
dependsOn
时,Eclipse说它不受欢迎。是Eclipse不正确地将其计算为
项目。dependsOn
而不是
任务。dependsOn
commonSomething
只是传递给配置的闭包,而不是任务定义。我相信当您在那里调用dependsOn时,您正在调用Project.dependsOn方法,这确实是不推荐的。好的,那么澄清一下:在为多个任务定义公共依赖项时,最好使用
[tasks]。每种方法。对吧?如果两者都有效,你选择哪一种可能取决于你的口味。我[可能很明显]更喜欢我发布的常用闭包方法。我发现,在
每个
闭包中,你也可以说
任务。使用{…}
将上下文“切换”到
任务
——你不再需要在每一行重复
任务。
tasks.withType(JavaExec) {
    jvmArgs "-Xmx1024m", "-XX:MaxPermSize=128m"
    main = "com.some.Main"
    classpath = sourceSets.main.runtimeClasspath
}