因此,例如,您无法编写:
a := 3
b := 4
您必须将它们分开,如下所示:
a := 3
b := 4
我想不出具有类似要求的其他文件格式。对于新来者来说绝对令人惊讶。甚至一些长期使用sbt的用户也认为它令人反感。
以我的经验,这是在更改之前关于sbt的最经常问到的单个问题。
最佳答案
从sbt 0.13.7开始,不再需要空白行。因此,以下是历史信息。
简短的答案是空行使文件可机读和可写。
让我们打开包装。
首先,请注意,设置通常使用多行,例如长Seq或包含代码的任务正文。
其次,请注意设置是表达式,而不是语句。因此,sbt无法推断它们之间的分号。在Scala中,仅在语句之间推断分号。
因此需要空白行,以便sbt知道一个设置在哪里结束而下一个设置在哪里开始。
从理论上讲,它是否可以确定?也许。在2011年,Mark Harrah(sbt的创建者)wrote:
using the compiler to separate expressions [...] may happen at some point, but I try to avoid introducing the overhead of starting up a compiler wherever possible
因此,事实证明,此处的关键问题是性能。众所周知,Scala编译器的速度很慢。接下来,您可能会想知道,无论如何,都需要编译设置,不是吗?是的,但是很少有人意识到,为了提高性能,.sbt文件中的每个设置都是单独编译的,并且即使在sbt调用之间也要缓存编译结果。因此,如果您编辑构建并更改一项设置,则仅重新编译一项设置。
上面,我说过.sbt文件是机器可写的,而不仅仅是机器可读的。您可以随时更改设置,然后使用
session save
保存更改。在2014年(Typesafe)的Jason Zaugg wrote:The decision [on blank lines] originally came from the constraint that build.sbt should be machine editable. In an SBT session, you can run
set foo := bar
, and that will be persisted into the file.In practise, people don't tend to use this feature that much, and we might revisit this decision [...]
有关空白行背后的设计注意事项以及将来如何更改的更多详细信息,请参阅Josh Suereth(也是Typesafe的作者)的this writeup。
关于sbt - 为什么以前的sbt(版本≤0.13.6)在.sbt文件中的设置之间需要空白行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21780787/