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

标签 sbt

因此,例如,您无法编写:

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/

相关文章:

java - 面向 .NET 开发人员的 Scala IDE

scala - 使用错误的 Scala 版本创建 Spark 应用程序

scala - SBT:修复库依赖项的逐出警告是否明智

scala - Play sbt-plugin (Build.scala) 的文档在哪里?

playframework-2.0 - SBT。解决 play sbt-plugin 的依赖关系

scala - 当我尝试在 Spark-Scala 中编译 SBT 时,错误 package org.apache.spark.sql is not a value

sbt - SBT 可以与 jMockit 一起使用吗?

scala - 如何运行 Akka

scala - 如何在 SBT 中处理超过 11 个任务的依赖关系

java - 运行实例化 NiFi 接收器的 Spark 应用程序时出现依赖项错误