我有一个sbt项目,其中有几个模块需要打包到jar归档中。正如我在日志中看到的,sbt按顺序将每个项目打包到jar中:
[info] Packaging C:path\target\scala-2.11\projectFirst ...
[info] Packaging C:path\target\scala-2.11\projectSecond ...
[info] Packaging C:path\target\scala-2.11\projectThrird ...项目之间不相互依赖,可以并行打包。有没有可能将sbt设置为并行打包项目?
发布于 2014-11-28 23:03:58
在sbt documentation中,我们可以找到以下句子:
默认情况下,sbt并行执行任务。
我准备了实验来验证这一点。我创建了一个包含4个子项目的项目。这是一个代码:
主build.sbt:
lazy val sub1 = project
lazy val sub2 = project
lazy val sub3 = project
lazy val sub4 = project
Keys.`package` in Compile <<= (Keys.`package` in Compile).dependsOn(Def.task {
})sub1/build.sbt
Keys.`package` in Compile <<= (Keys.`package` in Compile).dependsOn(Def.task {
for( a <- 1 to 2){
Thread.sleep(1000)
println( "SubProject 1: " + a );
}
})在sub2中,sub3和sub4 build.sbt几乎与sub1中相同。我只更改了迭代次数和打印数量。我收到了以下输出:
> package
SubProject 4: 1
SubProject 1: 1
SubProject 4: 2
SubProject 1: 2
SubProject 4: 3
SubProject 3: 1
SubProject 4: 4
SubProject 3: 2
SubProject 4: 5
SubProject 3: 3
SubProject 4: 6
SubProject 3: 4
SubProject 4: 7
SubProject 2: 1
SubProject 4: 8
SubProject 2: 2
SubProject 4: 9
SubProject 2: 3
[info] Updating {file:/D:/sbt/abc/}sub1...
[info] Resolving org.scala-lang#scala-library;2.10.4 ...
[info] Resolving org.scala-lang#scala-compiler;2.10.4 ...
SubProject 4: 10
[info] Resolving org.scala-lang#scala-reflect;2.10.4 ...
[info] Resolving org.scala-lang#jline;2.10.4 ...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Updating {file:/D:/sbt/abc/}abc...
[info] Resolving org.scala-lang#scala-library;2.10.4 ...
[info] Resolving org.scala-lang#scala-compiler;2.10.4 ...
[info] Resolving org.scala-lang#scala-reflect;2.10.4 ...
[info] Resolving org.scala-lang#jline;2.10.4 ...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Updating {file:/D:/sbt/abc/}sub3...
[info] Resolving org.scala-lang#scala-library;2.10.4 ...
[info] Resolving org.scala-lang#scala-compiler;2.10.4 ...
[info] Resolving org.scala-lang#scala-reflect;2.10.4 ...
[info] Resolving org.scala-lang#jline;2.10.4 ...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Updating {file:/D:/sbt/abc/}sub2...
[info] Resolving org.scala-lang#scala-library;2.10.4 ...
[info] Resolving org.scala-lang#scala-compiler;2.10.4 ...
[info] Resolving org.scala-lang#scala-reflect;2.10.4 ...
[info] Resolving org.scala-lang#jline;2.10.4 ...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
SubProject 4: 11
[info] Done updating.
[info] Packaging D:\sbt\abc\sub1\target\scala-2.10\sub1_2.10-0.1-SNAPSHOT.jar ...
[info] Done packaging.
[info] Packaging D:\sbt\abc\target\scala-2.10\abc_2.10-0.1-SNAPSHOT.jar ...
[info] Done packaging.
[info] Packaging D:\sbt\abc\sub3\target\scala-2.10\sub3_2.10-0.1-SNAPSHOT.jar ...
[info] Done packaging.
[info] Packaging D:\sbt\abc\sub2\target\scala-2.10\sub2_2.10-0.1-SNAPSHOT.jar ...
[info] Done packaging.
SubProject 4: 12
SubProject 4: 13
SubProject 4: 14
SubProject 4: 15
SubProject 4: 16
SubProject 4: 17
SubProject 4: 18
SubProject 4: 19
SubProject 4: 20
[info] Updating {file:/D:/sbt/abc/}sub4...
[info] Resolving org.scala-lang#scala-library;2.10.4 ...
[info] Resolving org.scala-lang#scala-compiler;2.10.4 ...
[info] Resolving org.scala-lang#scala-reflect;2.10.4 ...
[info] Resolving org.scala-lang#jline;2.10.4 ...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Packaging D:\sbt\abc\sub4\target\scala-2.10\sub4_2.10-0.1-SNAPSHOT.jar ...
[info] Done packaging.所以有四个子项目。在每个子项目中,“包”任务依赖于创建的任务(在循环中打印和休眠)。当我执行'package‘命令时,wach子项目就会执行这个任务。但是对于每一个,依赖的任务都被称为。正如我们在输出中看到的,这些相关任务运行得很苍白,但一次只能运行两个。这与doc中的以下句子相对应:
(虽然从未公开为设置,但在给定时间运行的最大任务数也可以在内部配置。)
以下是输出中的三行:
[info] Resolving org.scala-lang#scala-compiler;2.10.4 ...
SubProject 4: 10
[info] Resolving org.scala-lang#scala-reflect;2.10.4 ...提供来自一个子项目的打包任务与其他子项目的依赖任务并行运行的证明。
https://stackoverflow.com/questions/27168196
复制相似问题