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

时间:2012-10-25 15:29:35

标签: gradle

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

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

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

4 个答案:

答案 0 :(得分:25)

我发现使用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...
}

答案 1 :(得分:7)

这可以使用普通的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的Spread operator

设置单个参数
[runSomething, debugSomething]*.main = "com.some.Main"

答案 2 :(得分:2)

请参阅section 51.2 of the manual。 AFAICT,它准确地显示了你想要的东西。

答案 3 :(得分:2)

我一直在搜索类似的东西我不想所有相同类型的任务之间共享配置,但仅限于其中一些。

我尝试过接受过的答案中陈述的内容,虽然效果不佳。我会再试一次。

我已经到了这里,我不介意分享,至少现在有一个更好的,Gradle的内置方式来实现这里所要求的东西。它就像:

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

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