6

我有一个包含多个子项目的 SBT 项目,即:

> projects
[info] In file:/home/me/src/foo/
[info]     popen
[info]     foobar-core
[info]   * foobar-client
[info]     foobar-db

有没有办法在每个子项目中运行一个动作?我正在寻找类似的东西publish-all,因为我目前浏览了所有子项目并publish手动运行,一旦有多个子项目,这将变得相当乏味。

sbt-0.11.2出于惯性使用,但如果有帮助,我愿意升级。

4

2 回答 2

10

您可以定义一个聚合所有其他项目的项目。在此项目上运行的每个操作都将在所有聚合上运行。这是来自sbt wiki的示例:

import sbt._
import Keys._

object HelloBuild extends Build {
    lazy val root = Project(id = "hello",
                            base = file(".")) aggregate(foo, bar)

    lazy val foo = Project(id = "hello-foo",
                           base = file("foo"))

    lazy val bar = Project(id = "hello-bar",
                           base = file("bar"))
}
于 2012-09-05T10:51:19.387 回答
-1

Kim Stebel 的答案非常有效,但需要一个聚合项目。

(以下方案是用 sbt 1.3.x 测试的)

我想要一个更动态的解决方案。我们有一个小的 sbt 插件,无论如何我们所有的项目都会用到它。所以我添加了这个:

val allProjects = Command.single("allProjects"){ (s,task) =>
  val extracted = Project extract s
  import extracted._
  import currentRef.{ build => curi}
  val build = structure.units(curi)
  build.defined.keys.map(projectId => s"$projectId/$task").foldRight(s)(_ :: _)
}

  override def globalSettings: Seq[Def.Setting[_]] = {
    List(
      commands += allProjects,
      ...
    )
  }

对于单build.sbt只使用commands += allProjects添加行的第一部分

这将创建命令allProjects并且可以像allProjects compile.

执行顺序发生,因此它是阻塞的。

最好试试这个

经过一番挖掘,我发现,如果没有.创建带有路径的项目,则默认情况下所有项目都聚合在根项目中。

我们的问题是,我们希望我们的根项目被命名,所以我们将它定义为

lazy val coolProjectName = project.in(file("."))

我在 build.sbt 中将其更改为:

name := "coolProjectName"

这样默认聚合仍然有效。聚合项目上的命令/任务是并行执行的。

于 2019-12-24T05:44:08.430 回答