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设置中定义多个相关任务之间的执行顺序?的主要内容,如果未能解决你的问题,请参考以下文章
组织多个 scala 相互关联的 sbt 和 git 项目 - 最佳实践建议