2017-10-04 85 views
1

根据SBT documentation,“通过声明项目类型的延迟val来定义项目。”为什么SBT项目声明为懒惰的vals?

这当然是常态,也是我们正在做的,但我想知道如果有什么是它需要懒惰的原因。

使用的常规val代替lazy val似乎工作。当然,使用严格的vals会导致项目定义按顺序初始化,这意味着前向引用不起作用,需要按依赖性顺序定义项目。

对于一个相对较大的构建,有53个相互依存的项目,执行顺序实际上是一件好事™,所以我想知道是否存在使用惰性val的实际原因 - 除了允许以任意顺序进行定义。

回答

2

这是一个常见的“最佳实践”。我还没有看到有人明确说明这一点,但从我的经验来看,这种做法与sbt的一些特征有关。

  1. SBT解析任何*.sbt文件
  2. SBT计算一个*.sbt文件从上到下
  3. 你可以在多个SBT文件

现在想象一下你想构建你的一切之间产生依赖性为了便于阅读,请使用build.sbt。我们有一些共同的设置和3个项目(一个根和两个版本)

val root = project.in(file(".")) 
     .settings(commonSettings) 
     .aggregate(api, server) 

val api = project.in(file("api")) 
     .settings(commonSettings) 
     .settings(name := "server") 

val server= project.in(file("api")) 
     .settings(commonSettings) 
     .settings(name := "api") 
     .dependsOn(api) 

val commonSettings = Seq(organization := "com.example") 

SBT将无法启动多重的东西是错误的在这build.sbt

  1. apiserver模块的引用它们被定义
  2. commonSettings之前root项目在所有项目的定义前引用

没有做任何事情lazy它很难重构你的构建文件。这是所有sbt文档每次都使用lazy val的原因。为了避免第一次使用者感到困惑和沮丧。

希望有帮助, Muki

相关问题