我有一个包含多个子项目的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
惯性,但如果有帮助我愿意升级。
答案 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")'> </div>
<div id='topMiddle' class='action-box' onclick='move("topMiddle")'> </div>
<div id='topRight' class='action-box' onclick='move("topRight")'> </div>
<br>
<div id='middleLeft' class='action-box' onclick='move("middleLeft")'> </div>
<div id='middleMiddle' class='action-box' onclick='move("middleMiddle")'> </div>
<div id='middleRight' class='action-box' onclick='move("middleRight")'> </div>
<br>
<div id='bottomLeft' class='action-box' onclick='move("bottomLeft")'> </div>
<div id='bottomMiddle' class='action-box' onclick='move("bottomMiddle")'> </div>
<div id='bottomRight' class='action-box' onclick='move("bottomRight")'> </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("."))
这样,默认聚合仍然有效。 聚合项目上的命令/任务可以并行执行。