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

Dav*_*son 23 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
}
Run Code Online (Sandbox Code Playgroud)

Ala*_*ger 29

我发现使用这种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...
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*son 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"
}
Run Code Online (Sandbox Code Playgroud)

即使debugSomething.jvmArgs被调用两次,所有三个参数都提供给JVM.

可以使用Groovy的Spread运算符设置单个参数:

[runSomething, debugSomething]*.main = "com.some.Main"
Run Code Online (Sandbox Code Playgroud)

  • 我发现,在`each`闭包中,你也可以说`task.with {...}`来"切换上下文"到`task` - 你不再需要在每个`task`上重复`task`然后. (2认同)