【问题标题】:Sbt : multi task orderingSbt:多任务排序
【发布时间】:2021-01-11 16:46:25
【问题描述】:

我想让任务在 sbt 中相互依赖。我希望任务task2task3 之前执行。 这是我的代码:

Task1.dependsOn(task3)
Task3.dependsOn(task2)

task2task3 之前执行,然后task1 被执行。 现在如果我使用这个:

Task1.dependsOn(task2, task3)

sbt 是否保留任务的顺序?所以执行顺序是 2 3 1 ?

【问题讨论】:

    标签: scala sbt task


    【解决方案1】:

    TL;DR:答案是否定的。它不保持秩序。让我们检查一下。

    我创建了一个简单的build.sbt,其中包含:

    val task1 = taskKey[Seq[String]]("taks1")
    val task2 = taskKey[Seq[String]]("taks2")
    val task3 = taskKey[Seq[String]]("taks3")
    
    task1 := {
      println("task1")
      Seq("111")
    }
    
    task2 := {
      println("task2")
      Seq("222")
    }
    
    task3 := {
      println("task3")
      Seq("333")
    }
    

    然后添加:

    task1 := task1.dependsOn(task2, task3).value
    

    当运行 sbt task1 时,我得到一致的输出:

    task2
    task3
    task1
    

    这可能会让您认为后者是第一个执行的。这只是部分正确。让我们记住,这些操作是异步的。让我们添加一些睡眠和打印。让我们修改task2(应该先打印):

    task2 := {
      println("task2 started")
      Thread.sleep(1000)
      println("task2 finished")
      Seq("222")
    }
    

    然后运行task1提供:

    task2 started
    task3
    task2 finished
    task1
    

    这证明他们不维护秩序。如果您确实想保持秩序,有很多方法可以实现这一目标。例如:

    task1 := task1.dependsOn(task3).dependsOn(task2).value
    

    哪个输出:

    task2 started
    task2 finished
    task3
    task1
    

    或者:

    task1 := task1.dependsOn(task3).value
    task1 := task1.dependsOn(task2).value
    

    输出相同。或者你甚至可以将task2 声明为task3 的依赖:

    task1 := task1.dependsOn(task3).value
    task3 := task3.dependsOn(task2).value
    

    输出相同。在做出决定之前,您可能需要阅读 Task graphScope delegation (.value lookup)

    【讨论】:

      猜你喜欢
      • 2016-04-22
      • 2017-08-19
      • 1970-01-01
      • 2019-08-14
      • 2017-06-24
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      相关资源
      最近更新 更多