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

为什么以前的sbt(版本≤;0.13.6)要求.sbt文件中的设置之间有空行?,sbt,Sbt,例如,你不能写: a := 3 b := 4 你必须把它们分开,就像这样: a := 3 b := 4 我想不出有类似要求的其他文件格式。这对新来者来说无疑是令人惊讶的。甚至一些长期使用sbt的用户也认为它令人反感 根据我的经验,这是SBT在改变之前最常被问到的一个问题。 < P>> SBT 0.137,不再需要空白行。下面是历史信息 简短的答案是空白行使文件机器可读和机器可写。 让我们把这个打开 首先,请注意,设置通常使用多行,例如长序列或包含代码的任务体 其次,请注意,设置是表达式,而

例如,你不能写:

a := 3
b := 4
你必须把它们分开,就像这样:

a := 3

b := 4
我想不出有类似要求的其他文件格式。这对新来者来说无疑是令人惊讶的。甚至一些长期使用sbt的用户也认为它令人反感


根据我的经验,这是SBT在改变之前最常被问到的一个问题。

< P>> SBT 0.137,不再需要空白行。下面是历史信息

简短的答案是空白行使文件机器可读和机器可写。 让我们把这个打开

首先,请注意,设置通常使用多行,例如长序列或包含代码的任务体

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

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

理论上,它能确定这一点吗?也许。2011年,马克·哈拉(sbt的创始人):

使用编译器分离表达式[…] 可能在某个时候发生,但我尽量避免引入 尽可能地启动编译器

因此,这里的一个关键问题是性能。Scala编译器是出了名的慢。你可能会想,不管怎样,这些设置都需要编译,不是吗?是的,但是很少有人意识到为了提高性能,.sbt文件中的每个设置都是单独编译的,编译的结果是缓存的,即使在调用sbt之间也是如此。因此,如果编辑构建并更改一个设置,则只会重新编译该设置

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

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

在实践中,人们不太倾向于使用此功能,我们可能会再次访问 本决定[……]


详细说明了空白行后面的设计考虑,以及未来可能如何改变,参见Josh Suereth(也有Type SeaFe)。请参阅,第2项Anks Josh-我将链接纳入了我的答案中。请注意。编辑问题标题以反映这一点。