在SBT中,如果两个都包含相同的子模块,是否在后面遵循聚合取决于dependOn?根据文档看来,是这样,但是我之前已经看到过这种行为,我不明白这样做有什么好处。如果一个项目定义了依赖关系,这是否已经暗示对那些相同的依赖关系进行汇总?我注意到,使用此冗余聚合比不使用该冗余聚合,我的项目构建要慢得多,我想知道是否可以安全地删除它。
lazy val module = sbt.Project(...) dependsOn (foo, bar) aggregate (foo, bar)
要不就...
lazy val module = sbt.Project(...) dependsOn (foo, bar)
我正在使用SBT 0.13.6
TL;博士 aggregate
使任务到聚合模块和所有中执行aggregate
d之一,而dependsOn
集的CLASSPATH依赖这样的库对可见aggregate
ING模块(取决于是配置compile
又名default
中的例子)。
展示差异的样本。
我正在使用以下内容build.sbt
(没有什么真正有趣的):
lazy val a = project
lazy val b = project
lazy val c = project dependsOn b aggregate (a,b)
构建定义了三个模块a
,b
以及c
与最后c
项目是聚集a
和b
。第四个模块是一个隐式模块a
,它汇总了所有模块b
,和c
。
> projects
[info] In file:/Users/jacek/sandbox/aggregate-dependsOn/
[info] a
[info] * aggregate-dependson
[info] b
[info] c
当我在aggreate
ing模块中执行任务时,该任务将在aggregate
d模块中执行。
> compile
[info] Updating {file:/Users/jacek/sandbox/aggregate-dependsOn/}b...
[info] Updating {file:/Users/jacek/sandbox/aggregate-dependsOn/}a...
[info] Updating {file:/Users/jacek/sandbox/aggregate-dependsOn/}aggregate-dependson...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Updating {file:/Users/jacek/sandbox/aggregate-dependsOn/}c...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[success] Total time: 0 s, completed Oct 22, 2014 9:33:20 AM
当我执行任务时会发生同样的情况,而任务c
又会针对a
和b
而不是在顶级项目中执行。
> show c/clean
[info] a/*:clean
[info] ()
[info] b/*:clean
[info] ()
[info] c/*:clean
[info] ()
[success] Total time: 0 s, completed Oct 22, 2014 9:34:26 AM
在a
或中执行任务时b
,它仅在项目内运行。
> show a/clean
[info] ()
[success] Total time: 0 s, completed Oct 22, 2014 9:34:43 AM
任务是否在aggregate
项目中执行是由aggregate
范围为项目和/或任务的键控制的。
> show aggregate
[info] a/*:aggregate
[info] true
[info] b/*:aggregate
[info] true
[info] c/*:aggregate
[info] true
[info] aggregate-dependson/*:aggregate
[info] true
如汇总所述更改它:
在这种情况下,在进行聚合的项目(即根项目)中,您可以控制每个任务的聚合。(...)
aggregate in
update是作用于更新任务的聚合键。
下面,我更改了c
模块和clean
任务的键,因此clean
不再在aggregate
d模块a
和中执行b
:
> set aggregate in (c, clean) := false
[info] Defining c/*:clean::aggregate
[info] The new value will be used by no settings or tasks.
[info] Reapplying settings...
[info] Set current project to aggregate-dependson (in build file:/Users/jacek/sandbox/aggregate-dependsOn/)
> show c/clean
[info] ()
[success] Total time: 0 s, completed Oct 22, 2014 9:39:13 AM
的其他任务c
不受影响,仍在执行任务c
的aggregate
模块中将运行该任务:
> show c/libraryDependencies
[info] a/*:libraryDependencies
[info] List(org.scala-lang:scala-library:2.10.4)
[info] b/*:libraryDependencies
[info] List(org.scala-lang:scala-library:2.10.4)
[info] c/*:libraryDependencies
[info] List(org.scala-lang:scala-library:2.10.4)
虽然aggregate
为sbt任务设置了一个依赖关系,以便它们在其他aggregate
d模块中执行,但dependsOn
设置了CLASSPATH依赖关系,即dependsOn
ed模块中的代码在一个中可见dependsOn
(对不起“新”字)。
假设b
有一个主要对象如下:
object Hello extends App {
println("Hello from B")
}
将Hello
对象保存到b/hello.scala
,即在b
模块下。
由于c
已定义为dependsOn b
(参见build.sbt
上文),因此该Hello
对象在中可见b
(因为它属于模块),但在中也是可见的c
。
> b/run
[info] Running Hello
Hello from B
[success] Total time: 0 s, completed Oct 22, 2014 9:46:44 AM
> c/runMain Hello
[info] Running Hello
Hello from B
[success] Total time: 0 s, completed Oct 22, 2014 9:46:58 AM
(我不得不使用runMain
在c
作为run
单独看不到类,我无法解释)。
由于该类在模块中不可见,因此a
最终尝试运行该任务。java.lang.ClassNotFoundException: Hello
> a/runMain Hello
[info] Updating {file:/Users/jacek/sandbox/aggregate-dependsOn/}a...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Running Hello
[error] (run-main-6) java.lang.ClassNotFoundException: Hello
java.lang.ClassNotFoundException: Hello
at java.lang.ClassLoader.findClass(ClassLoader.java:530)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[trace] Stack trace suppressed: run last a/compile:runMain for the full output.
java.lang.RuntimeException: Nonzero exit code: 1
at scala.sys.package$.error(package.scala:27)
[trace] Stack trace suppressed: run last a/compile:runMain for the full output.
[error] (a/compile:runMain) Nonzero exit code: 1
[error] Total time: 0 s, completed Oct 22, 2014 9:48:15 AM
重新定义a
为dependsOn b
in build.sbt
,异常消失。
您应该阅读官方文档中的多项目构建。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句