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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scala:如何在SBT设置中定义多个相关任务之间的执行顺序?相关的知识,希望对你有一定的参考价值。

我无法理解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的任务定义。它如何影响订购?这两个被覆盖的任务是否按顺序执行?

答案

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

以上是关于scala:如何在SBT设置中定义多个相关任务之间的执行顺序?的主要内容,如果未能解决你的问题,请参考以下文章

将多个 sbt 任务合并为一个

使用 sbt 运行多个应用程序

组织多个 scala 相互关联的 sbt 和 git 项目 - 最佳实践建议

如何使用 scala sbt 构建多个 jar 文件

在 SBT 中添加 sbt native packager 插件

如何从scala对象中的sbt ProjectPlugin.scala加载对象