Избегайте дублирования между аналогичными задачами 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
}
Ответы
Ответ 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"
Ответ 3
Обратитесь к разделу в разделе 51.2 руководства. AFAICT, он точно показывает, что вы хотите.
Ответ 4
Я искал нечто похожее с той разницей, что я не хочу делиться конфигурацией между all задачами одного и того же типа, но только для некоторые из них.
Я пробовал что-то вроде заявленного в принятом ответе, но он плохо работал. Я попробую еще раз.
Как я уже здесь, я не против, чтобы поделиться, есть (по крайней мере сейчас) лучший, Gradle встроенный способ добиться того, что было задано здесь. Он выглядит следующим образом:
tasks.withType(JavaExec) {
jvmArgs "-Xmx1024m", "-XX:MaxPermSize=128m"
main = "com.some.Main"
classpath = sourceSets.main.runtimeClasspath
}
Таким образом, все задачи типа JavaExec
получат конфигурацию по умолчанию, которая, очевидно, может быть изменена любой конкретной задачей того же типа.