背景
我有一个SBT项目,会有大量的子项目。在VCS更改(拉出、切换分支等)之后,重新编译可能需要很长时间。我想通过使用一种策略来减少时间,在每个子项目的基础上有一个分布式缓存。对于这种策略,巴克有一个很好的解释:
构建规则知道所有可能影响其输出的输入,因此它可以将这些信息组合成表示总输入的散列。 当Buck开始构建一个构建规则时,它所做的第一件事就是计算规则的缓存键。如果在.buckconfig中指定的任何缓存中有命中,那么它将从缓存中获取规则的输出,而不是在本地构建规则。 如果您正在使用某种持续集成( CI )系统,您可能希望您的CI构建填充可由本地构建读取的缓存。这样,当开发人员同步到已经构建在CI系统上的修订版时,运行buck build不应该在本地构建任何内容,因为所有的输出都应该能够从缓存中提取出来。
因此,我希望能够在满足缓存密钥时填充target。
问题
问题是,我似乎不知道SBT想要什么时候重新编译。
build.properties
sbt.version=0.13.7src/main/scala/Foo.scala
class Foo {}第一次汇编:
$ sbt compile
[info] Compiling 1 Scala source
[success]更改源触发重新编译
$ echo >> src/main/scala/Foo.scala
$ sbt compile
[info] Compiling 1 Scala source
[success]更改源时间戳不会触发重新编译
$ touch src/main/scala/Foo.scala
$ sbt compile
[success]更改目标时间戳触发器重新编译
$ touch target/scala_2.10/classes/Foo.class
$ sbt compile
[info] Compiling 1 Scala source
[success]SBT如何知道目标与源不匹配?(我能以SBT接受目标的方式放置目标吗?)
发布于 2015-01-13 17:56:35
答案有点复杂。我们采用了一些类似于buck的方法,但没有预先考虑过有一个全局可分发的缓存。
基本上,这是总的要点:
-optimise需要重新编译)。
第三点最近给我们带来了外部字节码操作库的麻烦。我们最近扩展了默认构建,以便在构建哈希/缓存信息之前将这些构建容纳到构建中,请参阅:https://github.com/sbt/sbt/pull/1714。
希望这有助于澄清。我们的检查可能会有更多的事情发生。其中大部分位于sbt的compile/目录中。
https://stackoverflow.com/questions/27928152
复制相似问题