为什么SBT项目被宣布为懒惰的?

时间:2017-10-04 15:08:15

标签: sbt

根据SBT documentation,"通过声明类型为Project的延迟val来定义项目。"

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

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

对于一个相对较大的构建,有53个相互依赖的项目,强制执行的命令实际上是一个Good Thing™,所以我想知道是否存在使用延迟val的实际原因 - 除了允许定义以任意方式发生顺序。

1 个答案:

答案 0 :(得分:5)

这是一种常见的“最佳做法”。我没有看到任何人明确说明这一点,但根据我的经验,这种做法与sbt的一些特征有关。

  1. sbt解析任何 html, body { height: 100%; overflow: hidden; } .wrapper { margin: 0 auto; padding: 40px; max-width: 800px; } .mytable { height: 100%; overflow: auto; margin: 0 0 40px 0; width: 100%; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); display: table; table-layout: fixed; } 文件
  2. sbt从上到下评估*.sbt个文件
  3. 您可以在多个sbt文件中的所有内容之间创建依赖关系
  4. 现在假设您想构建*.sbt以便于阅读。我们有一些常见的设置和3个项目(一个根和两个版本)

    build.sbt

    sbt将无法启动,因为此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")

    中存在多个错误
    1. build.sbtapi模块在​​server项目定义之前被引用
    2. root在所有项目中的定义之前被引用
    3. 如果没有制作所有内容commonSettings,则很难重构构建文件。这就是所有sbt文档每次使用lazy的原因。为了避免首次使用者感到困惑和沮丧。

      希望有所帮助, 缪奇