3

因此,如果我们有一个 drop db 任务和一个 create db 任务以及一个 start server 任务和一个 runqtest 任务,我们想要

  1. 有独立的任务,所以我可以自己调用 gradle dropdb (或其他)
  2. 让 runqtest 依赖于 dropdb、createdb、populatedb、startserver

上面的数字 2 显然需要订购或将中断,并且 gradle 不像 ant 那样遵守任何订单。如何做到这一点?(我在这篇文章中读过很多关于这个的内容

http://markmail.org/thread/wn6ifkng6k7os4qn#query:+page:1+mid:hxibzgim5yjdxl7q+state:results

尽管当您拥有 1. e 取决于 c 和 d 2. c 取决于 b、a 3. d 取决于 a、b

由于 e 决定 c 将是第一个,构建将运行 b,a,c,d 所以它是完全确定的。我确实同意,如果您有订单,尽管像 ant 一样,并行化构建要困难得多,因为您不能只并行运行 c 和 d,因为订单很重要(而且从用户的角度来看更糟,大多数情况都无关紧要时间)。

如果他们会添加一个dependsOnOrdered,那么我们可以在绝对必要时进行订购。

或者有谁知道我们应该怎么做?这个问题是在 2009 年针对 gradle 提出的!!!!我仍然没有在 gradle 中看到关于如何在需要时执行订购的东西的文档。

院长

4

2 回答 2

5

这是一种解决方案:

if (gradle.startParameter.taskNames.contains("qatest") {
    qatest.dependsOn startServer
    startServer.dependsOn populatedb
    populatedb.dependsOn createdb
    createdb.dependson dropdb 
}

这种方法的局限性在于,它仅qatest在命令行上提供的初始任务的一部分时才有效。有时这已经足够好了,您可以添加检查以确保用户不会出错。

如果您更频繁地需要它,您可以添加一个小助手方法,以便更轻松地声明这样的工作流。类似的东西workflow(qatest, dropdb, createdb, populatedb, startserver)

另一种方法是创建任务的“克隆”,并(仅)在克隆之间添加任务依赖项。同样,您可以将其隐藏在一些抽象后面。例如,createWorkflowTask("startServer") { ... }可以同时创建和配置 astartServerstartServerWorkflowtask。

综上所述,Gradle 的可编程性使得克服“工作流”在 Gradle 中还不是一流概念的问题成为可能。

于 2013-01-28T19:37:35.833 回答
3

Gradle 1.6 添加了一个替代解决方案,但它仍在孵化中:mustRunAfter. 请参阅发行说明

于 2013-05-10T15:36:26.620 回答