В 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. Но для каждого из них называется зависимая задача. Как мы видим в выводе, эти зависимые задачи выполняются pallalelly, но только по два за раз. Это coresponds к следующей фразе из дока:
(хотя никогда не подвергается в качестве параметра, максимальное количество задач, запущенных в данный момент времени было внутренне настраивается так же.)
После трех линий от выхода :
[info] Resolving org.scala-lang#scala-compiler;2.10.4 ...
SubProject 4: 10
[info] Resolving org.scala-lang#scala-reflect;2.10.4 ...
Предоставить доказательство того, что задача упаковки из одного подпроекта выполняется параллельно с зависимой задачей из другого подпроекта.
Это ** компиляция ** цель, ** нет ** сборка какой пакет проекты. :) Кроме того, я вижу, что в проводнике процесса имеется 4 области загрузки с высокой загрузкой процессора, поэтому архивы упаковываются последовательно – Cherry