SBT:对所有项目执行操作

时间:2012-09-05 10:31:16

标签: scala sbt

我有一个包含多个子项目的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惯性,但如果有帮助我愿意升级。

2 个答案:

答案 0 :(得分:8)

您可以定义聚合所有其他项目的项目。此项目上运行的每个操作都将在所有聚合上运行。以下是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"))
}

答案 1 :(得分:0)

金·斯特贝尔(Kim Stebel)的答案很完美,但是需要一个汇总项目。

(以下解决方案已通过sbt 1.3.x进行了测试)

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

<div id='topLeft' class='action-box' onclick='move("topLeft")'>&nbsp;</div>
<div id='topMiddle' class='action-box' onclick='move("topMiddle")'>&nbsp;</div>
<div id='topRight' class='action-box' onclick='move("topRight")'>&nbsp;</div>
    <br>
<div id='middleLeft' class='action-box' onclick='move("middleLeft")'>&nbsp; </div>
<div id='middleMiddle' class='action-box' onclick='move("middleMiddle")'>&nbsp; </div>
<div id='middleRight' class='action-box' onclick='move("middleRight")'>&nbsp;</div>
    <br>
<div id='bottomLeft' class='action-box' onclick='move("bottomLeft")'>&nbsp;</div>
<div id='bottomMiddle' class='action-box' onclick='move("bottomMiddle")'>&nbsp;</div>
<div id='bottomRight' class='action-box' onclick='move("bottomRight")'>&nbsp;</div>

对于单个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的项目,则默认情况下所有项目都汇总在根项目中。

我们的问题是,我们喜欢将根项目命名,因此我们将其定义为

.

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

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

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