为什么sbt以前(版本≤0.13.6)在.sbt文件中的设置之间需要空行?

时间:2014-02-14 13:33:27

标签: sbt

所以例如你不能写:

a := 3
b := 4

你必须把它们分开,就像这样:

a := 3

b := 4

我想不出具有类似要求的其他文件格式。这对新人来说绝对令人惊讶。甚至一些长期用户认为这是令人反感的。

根据我的经验,在改变之前,这是关于sbt的最常见问题。

1 个答案:

答案 0 :(得分:22)

截至sbt 0.13.7,不再需要空白行。以下是现在的历史信息。

简短的回答是空白行使文件机器可读机器可写

让我们解开这个。

首先,请注意设置使用多行是常见的,例如长Seq或包含代码的任务主体。

其次,请注意设置是表达式,而不是语句。所以sbt无法推断它们之间的分号。在Scala中,只能在语句之间推断分号。

因此需要空白行,以便sbt知道一个设置的结束位置和下一个设置的开始位置。

从理论上讲,无论如何都能确定吗?也许。 2011年Mark Harrah(sbt的创造者)wrote

  

使用编译器分离表达式[...]   可能会在某个时刻发生,但我尽量避免引入开销   尽可能启动编译器

因此,事实证明,关键问题是性能。 Scala编译器非常慢。您可能接下来想知道,无论如何都需要编译设置,不是吗?是的,但很少有人意识到为了提高性能,.sbt文件中的每个设置都是单独编译和编译缓存的结果,即使在sbt的调用之间也是如此。因此,如果您编辑构建并更改一个设置,只会重新编译一个设置

上面,我说.sbt文件是机器可写,而不仅仅是机器可读的。您可以动态更改设置,然后使用session save保存更改。 2014年Jason Zaugg(Typesafe)wrote

  

[空白行]的决定最初来自build.sbt的约束   应该是机器可编辑的。在SBT会话中,您可以运行set foo := bar和   这将被保存到文件中。

     

在实践中,人们并不倾向于使用这个功能,我们可能会重新考虑   这个决定[...]

有关空白行背后的设计注意事项以及未来可能会如何变化的更多详细信息,请参阅Josh Suereth的this writeup(同样属于Typesafe)。