在多项目构建中依赖多个 gradle 任务
Depend on multiple gradle tasks in multi project build
目前我有启动Google云服务器、运行测试和停止服务器的任务。它在根项目中定义:
buildscript {...}
allprojects {...}
task startServer (dependsOn: "backend:appengineStart") {}
task testPaid (dependsOn: "app:connectedPaidDebugAndroidTest") {}
task stopServer (dependsOn: "backend:appengineStop") {}
task GCEtesting {
dependsOn = ["startServer",
"testPaid",
"stopServer"]
group = 'custom'
description 'Starts GCE server, runs tests and stops server.'
testPaid.mustRunAfter 'startServer'
stopServer.mustRunAfter 'testPaid'
}
我尝试了多种方法来写这样的东西,只有一个任务。我不知道如何从另一个项目引用任务并在其上调用 mustRunAfter。这不起作用(我也尝试参考 Project.tasks.getByPath、root.tasks 等):
task GCEtesting {
dependsOn = ["backend:appengineStart",
"app:connectedPaidDebugAndroidTest",
"backend:appengineStop"]
group = 'custom'
description 'Starts GCE server, runs tests and stops server.'
"app:connectedPaidDebugAndroidTest".mustRunAfter "backend:appengineStart"
"backend:appengineStop".mustRunAfter "app:connectedPaidDebugAndroidTest"
}
可能吗?使这项工作有效的正确语法是什么?
您的问题似乎是您将 dependsOn
视为 "invoke this task" 的意思。它实际上意味着 "ensure the result of the depended on task is available before the dependent task starts"。这就是为什么您的第一个解决方案不起作用:像 testPaid.mustRunAfter
这样的语句只会影响 testPaid
任务本身的操作,而不影响其依赖项。
无论如何,您可以使用 dependsOn
和 finalizedBy
获得您想要的行为,但它们必须在 app 的构建文件中声明子项目。
app/build.gradle:
task connectedPaidDebugAndroidTest {
//
//...
//
dependsOn 'backend:appengineStart' // Ensure appengineStart is run at some point before this task
finalizedBy 'backend:appendginStop' // Ensure appengineStop is run at some point after this task
}
然后,您可以 运行 您的测试只需 gradle app:connectedPaidDebugAndroidTest
。如果你真的想在根项目中定义一个任务来 运行 测试,那也很容易:
build.gradle:
task GCEtesting {
dependsOn = "app:connectedPaidDebugAndroidTest"
}
目前我有启动Google云服务器、运行测试和停止服务器的任务。它在根项目中定义:
buildscript {...}
allprojects {...}
task startServer (dependsOn: "backend:appengineStart") {}
task testPaid (dependsOn: "app:connectedPaidDebugAndroidTest") {}
task stopServer (dependsOn: "backend:appengineStop") {}
task GCEtesting {
dependsOn = ["startServer",
"testPaid",
"stopServer"]
group = 'custom'
description 'Starts GCE server, runs tests and stops server.'
testPaid.mustRunAfter 'startServer'
stopServer.mustRunAfter 'testPaid'
}
我尝试了多种方法来写这样的东西,只有一个任务。我不知道如何从另一个项目引用任务并在其上调用 mustRunAfter。这不起作用(我也尝试参考 Project.tasks.getByPath、root.tasks 等):
task GCEtesting {
dependsOn = ["backend:appengineStart",
"app:connectedPaidDebugAndroidTest",
"backend:appengineStop"]
group = 'custom'
description 'Starts GCE server, runs tests and stops server.'
"app:connectedPaidDebugAndroidTest".mustRunAfter "backend:appengineStart"
"backend:appengineStop".mustRunAfter "app:connectedPaidDebugAndroidTest"
}
可能吗?使这项工作有效的正确语法是什么?
您的问题似乎是您将 dependsOn
视为 "invoke this task" 的意思。它实际上意味着 "ensure the result of the depended on task is available before the dependent task starts"。这就是为什么您的第一个解决方案不起作用:像 testPaid.mustRunAfter
这样的语句只会影响 testPaid
任务本身的操作,而不影响其依赖项。
无论如何,您可以使用 dependsOn
和 finalizedBy
获得您想要的行为,但它们必须在 app 的构建文件中声明子项目。
app/build.gradle:
task connectedPaidDebugAndroidTest {
//
//...
//
dependsOn 'backend:appengineStart' // Ensure appengineStart is run at some point before this task
finalizedBy 'backend:appendginStop' // Ensure appengineStop is run at some point after this task
}
然后,您可以 运行 您的测试只需 gradle app:connectedPaidDebugAndroidTest
。如果你真的想在根项目中定义一个任务来 运行 测试,那也很容易:
build.gradle:
task GCEtesting {
dependsOn = "app:connectedPaidDebugAndroidTest"
}