scala:如何在SBT设置中定义多个相关任务之间的执行顺序?

问题描述 投票:1回答:1

我无法理解sbt(excerpted from SBT reference manual)如何确定任务之间的执行顺序。

此代码说明了SBT如何确定多个相关任务之间的执行顺序。据我所知,SBT执行多个并行依赖于一个任务的任务,因此无法明确指定与.value方法一起使用的多个依赖任务之间的执行顺序。

val startServer = taskKey[Unit]("start server")
val stopServer = taskKey[Unit]("stop server")
val sampleIntTask = taskKey[Int]("A sample int task.")
val sampleStringTask = taskKey[String]("A sample string task.")

lazy val commonSettings = Seq(
  organization := "com.example",
  version := "0.1.0-SNAPSHOT"
)

lazy val library = (project in file("library"))
  .settings(
    commonSettings,
    startServer := {
      println("starting...")
      Thread.sleep(500)
    },
    stopServer := {
      println("stopping...")
      Thread.sleep(500)
    },
    sampleIntTask := {
      startServer.value
      val sum = 1 + 2
      println("sum: " + sum)
      stopServer.value // THIS WON'T WORK
      sum
    },
    sampleStringTask := {
      startServer.value
      val s = sampleIntTask.value.toString
      println("s: " + s)
      s
    }
  )

在上面的代码中,sampleStringTask依赖于startServer和stopServer任务,输出消息可能会有所不同,具体取决于首先执行的任务。

这是相同代码的修改版本,总是以打印“停止......”结束。

lazy val library = (project in file("library"))
  .settings(
    commonSettings,
    startServer := {
      println("starting...")
      Thread.sleep(500)
    },
    sampleIntTask := {
      startServer.value
      val sum = 1 + 2
      println("sum: " + sum)
      sum
    },
    sampleStringTask := {
      startServer.value
      val s = sampleIntTask.value.toString
      println("s: " + s)
      s
    },
    sampleStringTask := {
      val old = sampleStringTask.value
      println("stopping...")
      Thread.sleep(500)
      old
    }
  )

在修改后的代码中,它提出了一种通过两次实现sampleStringTask来定义多个任务之间的固定执行顺序的方法。这里,任务的第二个定义包含下面代码中描述的stopServer任务的行为。

但是,我无法理解这两个函数是如何用于指定执行的确切顺序的。似乎第二个函数会覆盖sampleStringTask的任务定义。它如何影响订购?这两个被覆盖的任务是否按顺序执行?

scala sbt
1个回答
1
投票

在第二个示例中,当重新定义sampleStringTask时,它确保在重新定义的定义之前执行第一个定义。重要的是要理解重新定义的定义不会覆盖第一个定义,而是使用或取决于第一个定义。并且由于在评估任务(partial ordering),之前评估任务依赖性,因此在此处维护排序。

© www.soinside.com 2019 - 2024. All rights reserved.