gradle没有任务排序,所以如何实现这一目标

时间:2013-01-28 15:18:52

标签: gradle

因此,如果我们有一个drop db任务和一个create db任务,一个启动服务器任务和一个runqatest任务,我们想要

  1. 有独立的任务,所以我可以自己调用gradle dropdb(或其他人)
  2. 让runqatest依赖于dropdb,createdb,populatedb,startserver
  3. 上面的数字2显然需要订购或者会破坏,并且gradle不遵守像ant这样的任何订单。怎么做到这一点? (我在这篇文章中已经阅读了很多相关内容

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

    尽管一个用户错了,但是当你有这个用户时它不具有确定性  1.依赖于c和d  2. c取决于b,a  3. d取决于a,b

    因为e决定c将是第一个,所以构建将运行b,a,c,d因此它是完全确定的。我同意如果你有顺序,并且像蚂蚁一样,并行构建更加困难,因为你不能只是顺序运行c和d,因为顺序很重要(而且从用户的角度来看,它更糟糕,大多数情况下并不重要时间)。

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

    或者有谁知道我们应该这样做的方式是什么?这个问题是在2009年针对gradle提出的!我仍然没有看到gradle中有关如何在需要时执行有序操作的文档。

    迪安

2 个答案:

答案 0 :(得分: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") { ... }可以创建和配置startServerstartServerWorkflow任务。

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

答案 1 :(得分:3)

Gradle 1.6添加了另一种解决方案,但它仍在孵化:mustRunAfter。请参阅release notes