首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是什么决定了SBT中的重新编译?

是什么决定了SBT中的重新编译?
EN

Stack Overflow用户
提问于 2015-01-13 17:39:32
回答 1查看 454关注 0票数 1

背景

我有一个SBT项目,会有大量的子项目。在VCS更改(拉出、切换分支等)之后,重新编译可能需要很长时间。我想通过使用一种策略来减少时间,在每个子项目的基础上有一个分布式缓存。对于这种策略,巴克有一个很好的解释:

构建规则知道所有可能影响其输出的输入,因此它可以将这些信息组合成表示总输入的散列。 当Buck开始构建一个构建规则时,它所做的第一件事就是计算规则的缓存键。如果在.buckconfig中指定的任何缓存中有命中,那么它将从缓存中获取规则的输出,而不是在本地构建规则。 如果您正在使用某种持续集成( CI )系统,您可能希望您的CI构建填充可由本地构建读取的缓存。这样,当开发人员同步到已经构建在CI系统上的修订版时,运行buck build不应该在本地构建任何内容,因为所有的输出都应该能够从缓存中提取出来。

因此,我希望能够在满足缓存密钥时填充target

问题

问题是,我似乎不知道SBT想要什么时候重新编译。

build.properties

代码语言:javascript
复制
sbt.version=0.13.7

src/main/scala/Foo.scala

代码语言:javascript
复制
class Foo {}

第一次汇编:

代码语言:javascript
复制
$ sbt compile
[info] Compiling 1 Scala source
[success]

更改源触发重新编译

代码语言:javascript
复制
$ echo >> src/main/scala/Foo.scala
$ sbt compile
[info] Compiling 1 Scala source
[success]

更改源时间戳不会触发重新编译

代码语言:javascript
复制
$ touch src/main/scala/Foo.scala
$ sbt compile
[success]

更改目标时间戳触发器重新编译

代码语言:javascript
复制
$ touch target/scala_2.10/classes/Foo.class
$ sbt compile
[info] Compiling 1 Scala source
[success]

SBT如何知道目标与源不匹配?(我能以SBT接受目标的方式放置目标吗?)

EN

回答 1

Stack Overflow用户

发布于 2015-01-13 17:56:35

答案有点复杂。我们采用了一些类似于buck的方法,但没有预先考虑过有一个全局可分发的缓存。

基本上,这是总的要点:

  1. 我们看文件的散列。我相信这是可配置的,但仅仅触摸一个文件可能还不足以将其标记为已更改。另外,您可能还必须添加影响文件SHA-1的空格或其他内容。
  2. 我们查看由文件公开的API。这是用我们所谓的“hasher”来完成的。这实际上是试图构造源文件中使用的名称的散列,以确定一个源文件中的更改是否会影响另一个源文件。
  3. 我们检查生成的二进制文件,看看它们自上次生成以来是否发生了变化。如果是这样的话,我们会扔掉我们所做的事情,并假设我们必须再次这样做才能安全(例如,一些外部进程一直在我们的沙箱中运行,我们不知道在表面下是否有什么隐藏的东西)。
    1. 我们检查是否修改了任何JAR依赖项,或者是否有新的依赖项。
    2. 我们检查是否有编译器标志改变(例如,-optimise需要重新编译)。

第三点最近给我们带来了外部字节码操作库的麻烦。我们最近扩展了默认构建,以便在构建哈希/缓存信息之前将这些构建容纳到构建中,请参阅:https://github.com/sbt/sbt/pull/1714

希望这有助于澄清。我们的检查可能会有更多的事情发生。其中大部分位于sbt的compile/目录中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27928152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档