【问题标题】:Why are SBT projects declared as lazy vals?为什么 SBT 项目被声明为惰性验证?
【发布时间】:2018-03-16 01:07:42
【问题描述】:

根据SBT documentation,“通过声明 Project 类型的惰性 val 来定义项目。”

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

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

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

【问题讨论】:

    标签: sbt


    【解决方案1】:

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

    1. sbt 解析 any *.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 模块在定义之前在 root 项目中被引用
    2. commonSettings 在所有项目的定义之前被引用

    如果不制作所有内容lazy,则很难重构您的构建文件。这就是所有 sbt 文档都使用 lazy vals 的原因。为了避免初次使用的用户感到困惑和沮丧。

    希望有帮助, 渚

    【讨论】:

    • 如果我在这里错了,请纠正我。所以lazy val 用法的主要思想是允许重新排序声明,对吗?
    猜你喜欢
    • 1970-01-01
    • 2017-08-08
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    相关资源
    最近更新 更多