Избегайте дублирования между аналогичными задачами Gradle? - программирование
Подтвердить что ты не робот

Избегайте дублирования между аналогичными задачами 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
}
4b9b3361

Ответ 1

Я обнаружил, что использование метода 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...
}

Ответ 2

Это можно решить, используя обычный 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 Оператор распространения:

[runSomething, debugSomething]*.main = "com.some.Main"

Ответ 4

Я искал нечто похожее с той разницей, что я не хочу делиться конфигурацией между all задачами одного и того же типа, но только для некоторые из них.

Я пробовал что-то вроде заявленного в принятом ответе, но он плохо работал. Я попробую еще раз.

Как я уже здесь, я не против, чтобы поделиться, есть (по крайней мере сейчас) лучший, Gradle встроенный способ добиться того, что было задано здесь. Он выглядит следующим образом:

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

Таким образом, все задачи типа JavaExec получат конфигурацию по умолчанию, которая, очевидно, может быть изменена любой конкретной задачей того же типа.