【发布时间】:2015-01-18 03:49:35
【问题描述】:
我想写一个在所有子项目任务完成后运行的任务。
例如,如果我这样做了
sbt a b 然后在所有子项目上的任务 a 完成后,我想执行任务 b。我不想在每个项目上都做 (a b)。
这可能吗?
其实我就拿来直接修改build.sbt吧。我不一定要在命令行中指定。
【问题讨论】:
-
我建议你接受 EugeneYokota 的回答。
标签: sbt
我想写一个在所有子项目任务完成后运行的任务。
例如,如果我这样做了
sbt a b 然后在所有子项目上的任务 a 完成后,我想执行任务 b。我不想在每个项目上都做 (a b)。
这可能吗?
其实我就拿来直接修改build.sbt吧。我不一定要在命令行中指定。
【问题讨论】:
标签: sbt
我写了一篇关于这个主题的博文:sequencing tasks with sbt-sequential。
这是一个例子。我们将在 sub1 和 sub2 中定义自定义任务 a,在 root 中定义 b。实现顺序执行的最简单方法是使用addCommandAlias,所以我们就这样做。
lazy val a = taskKey[Unit]("a")
lazy val b = taskKey[Unit]("b")
lazy val root = (project in file(".")).
aggregate(sub1, sub2).
settings(addCommandAlias("ab", ";a;b"): _*).
settings(
b := {
println("b")
}
)
lazy val sub1 = (project in file("sub1")).
settings(a := println("a - sub1"))
lazy val sub2 = (project in file("sub2")).
settings(a := println("a - sub2"))
您可以在 shell 中以 sbt ab 运行它。
$ sbt ab
[info] Loading global plugins from ...
[info] Loading project definition from ...
[info] Set current project to root (in build ...)
a - sub2
a - sub1
[success] Total time: 0 s, completed Nov 22, 2014 8:36:18 PM
b
[success] Total time: 0 s, completed Nov 22, 2014 8:36:18 PM
这是另一个例子。这次使用Def.taskDyn,这也是博客文章中的特色。
我正在从aggregate 构造一个ScopeFilter,然后我将任务a 分派给他们。
lazy val a = taskKey[File]("a")
lazy val b = taskKey[Seq[File]]("b")
lazy val root = (project in file(".")).
aggregate(sub1, sub2).
settings(
b := (Def.taskDyn {
val proj = thisProject.value
val filter = ScopeFilter(inProjects(proj.aggregate: _*))
Def.task {
val allValues = a.all(filter).value
println(allValues.mkString(","))
allValues
}
}).value
)
lazy val sub1 = (project in file("sub1")).
settings(a := new File("a"))
lazy val sub2 = (project in file("sub2")).
settings(a := new File("b"))
您可以在 shell 中以 sbt b 身份运行它。
$ sbt b
[info] Loading global plugins from ...
[info] Loading project definition from ...
[info] Set current project to root (in build ...)
a,b
[success] Total time: 0 s, completed Nov 23, 2014 9:42:16 PM
【讨论】:
ScopeFilter (scala-sbt.org/0.13/docs/…)。添加了一个从当前项目的聚合中创建的示例。
thisProject.value、ScopeFilter(inPorjects(...)) 和 <task>.all(filter).value 的组合对我来说很关键。我不知道有一个.all 充实!