【问题标题】:What is the SBT := operator in build.sbt?build.sbt 中的 SBT := 运算符是什么?
【发布时间】:2018-07-18 03:34:05
【问题描述】:

我是 Scala 和 SBT 的新手。我注意到一个开源项目的 build.sbt 中有一个不熟悉的操作符:

:=

这里有几个例子说明它是如何使用的:

lazy val akkaApp = Project(id = "akka-app", base = file("akka-app"))
  .settings(description := "Common Akka application stack: metrics, tracing, logging, and more.")

在这个更大的代码 sn-p 中使用了几次:

lazy val jobServer = Project(id = "job-server", base = file("job-server"))
  .settings(commonSettings)
  .settings(revolverSettings)
  .settings(assembly := null.asInstanceOf[File])
  .settings(
    description := "Spark as a Service: a RESTful job server for Apache Spark",
    libraryDependencies ++= sparkDeps ++ slickDeps ++ cassandraDeps ++ securityDeps ++ coreTestDeps,
    test in Test <<= (test in Test).dependsOn(packageBin in Compile in jobServerTestJar)
      .dependsOn(clean in Compile in jobServerTestJar)
      .dependsOn(buildPython in jobServerPython)
      .dependsOn(clean in Compile in jobServerPython),
    testOnly in Test <<= (testOnly in Test).dependsOn(packageBin in Compile in jobServerTestJar)
      .dependsOn(clean in Compile in jobServerTestJar)
      .dependsOn(buildPython in jobServerPython)
      .dependsOn(clean in Compile in jobServerPython),
    console in Compile <<= Defaults.consoleTask(fullClasspath in Compile, console in Compile),
    fullClasspath in Compile <<= (fullClasspath in Compile).map { classpath =>
      extraJarPaths ++ classpath
    },
    fork in Test := true
  )
  .settings(publishSettings)
  .dependsOn(akkaApp, jobServerApi)
  .disablePlugins(SbtScalariform)

我最好的猜测是它的意思是“如果还没有声明就声明”。

【问题讨论】:

  • 你可能想阅读 sbt 手册的“Build definition”部分(或者更好的是,整个“Getting Started with sbt”)。
  • @dkim 我正计划“按需”阅读 sbt 文档。有趣的是,他们在入门指南中鼓励反对这一点。感谢您的提醒...所以看起来 :== 相同,只是它检查类型安全。
  • @LXXIII 普通的赋值运算符= 确实会检查类型安全性。
  • @LXXIII James Roper 的“sbt - A declarative DSL”对我也有帮助。
  • 感谢@dkim,那篇文章很好。带有:= 的行是“表达式,而不是语句”。安德烈的回答详细解释了。

标签: scala sbt operators


【解决方案1】:

:= 与普通的赋值运算符= 基本上没有任何关系。它不是内置的 scala 运算符,而是称为:= 的一系列方法/宏。这些方法(或宏)是SettingKey[T] 等类的成员(TaskKey[T]InputKey[T] 类似)。它们使用key := value 表达式的右侧,并返回Def.Setting[T](或类似地,Tasks)类型的实例,其中T 是键表示的值的类型。它们通常以中缀表示法编写。如果没有语法糖,这些方法/宏的调用将如下所示:

key.:=(value)

构造的Settings 和Tasks 依次是构建定义的基本构建块。

这里要理解的重要一点是,左侧的键不是代码块中的一些变量。左侧的键不仅代表函数调用的活动堆栈帧中的内存位置(就像一个简单的变量那样),而是相当复杂的对象,可以在构建过程中检查和传递。

【讨论】:

    猜你喜欢
    • 2012-05-11
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2021-12-04
    • 2021-10-28
    • 2021-02-13
    • 2012-11-21
    相关资源
    最近更新 更多