【问题标题】:SBT run task after all subprojectsSBT 在所有子项目之后运行任务
【发布时间】:2015-01-18 03:49:35
【问题描述】:

我想写一个在所有子项目任务完成后运行的任务。

例如,如果我这样做了

sbt a b 然后在所有子项目上的任务 a 完成后,我想执行任务 b。我不想在每个项目上都做 (a b)。

这可能吗?

其实我就拿来直接修改build.sbt吧。我不一定要在命令行中指定。

【问题讨论】:

  • 我建议你接受 EugeneYokota 的回答。

标签: sbt


【解决方案1】:

我写了一篇关于这个主题的博文: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

这是另一个例子。这次使用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

【讨论】:

  • 我以前读过这个(它真的很好),但它不是关于项目中的顺序排序吗?我希望任务 B 在任务 A 对所有主题执行后执行。例如,A A A A A B。
  • 这是否可行,因为没有为子项目定义 b?我问的原因是因为我想在所有其他任务之后运行的任务是插件添加的任务。基本上,我有一个报告任务,然后在为所有子项目运行报告后,我想运行一个报告聚合任务。我不能在每个项目之后单独运行它,因为我们需要先生成所有报告。
  • 您所追求的可能是ScopeFilter (scala-sbt.org/0.13/docs/…)。添加了一个从当前项目的聚合中创建的示例。
  • thisProject.valueScopeFilter(inPorjects(...))<task>.all(filter).value 的组合对我来说很关键。我不知道有一个.all 充实!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 2020-09-06
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多