26

有什么方法可以避免相同类型的两个类似任务之间的配置重复?

例如,我想创建一个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

4 回答 4

32

我发现使用该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...
}
于 2013-01-28T16:51:32.610 回答
8

这可以使用普通的 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 运算符设置单个参数:

[runSomething, debugSomething]*.main = "com.some.Main"
于 2012-11-06T15:47:13.500 回答
3

我一直在寻找类似的东西,但我不想在所有相同类型的任务之间共享配置,而只是为了其中一些任务。

我已经尝试过类似接受的答案中所述的方法,但效果不佳。那我再试一次。

当我来到这里时,我不介意分享,(至少现在)有一种更好的 Gradle 内置方式来实现这里提出的问题。它是这样的:

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

这样,所有JavaExec类型的任务都将接收默认配置,显然可以通过相同类型的任何特定任务来更改该配置。

于 2015-06-17T15:10:51.620 回答
1

请参阅手册第 51.2 节。AFAICT,它准确地显示了你想要的。

于 2012-10-25T15:54:05.140 回答