首页 > 解决方案 > 在多项目构建中依赖多个 gradle 任务

问题描述

目前我有启动谷歌云服务器、运行测试和停止服务器的任务。它在根项目中定义:

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"
}

可能吗?什么是使这项工作的正确语法?

标签: gradleandroid-gradle-pluginmulti-modulegradle-task

解决方案


看起来您的问题是您将dependsOn其视为“调用此任务”的意思。它实际上意味着“确保依赖任务的结果在依赖任务开始之前可用”。这就是为什么您的第一个解决方案不起作用的原因:诸如此类的语句testPaid.mustRunAfter仅影响testPaid任务本身的操作,而不影响其依赖项。

dependsOn无论如何,您可以使用and获得您想要的行为finalizedBy,但它们必须在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. 如果你真的想在根项目中定义一个任务来运行测试,那也很容易:

构建.gradle:

task GCEtesting {
    dependsOn = "app:connectedPaidDebugAndroidTest"
}

推荐阅读