build.sbt中的SBT :=操作符是什么?

5

我是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.")

并且它在这个较大的代码片段中使用了几次:

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)

我的最佳猜测是它的意思是“如果尚未声明,则声明它”。


2
你可能想阅读 sbt 手册中的“构建定义”部分(或者更好的是,整个“开始使用 sbt”)。 - dkim
@dkim 我打算按需阅读 sbt 文档。有趣的是,他们在《入门指南》中反对这样做。感谢提醒...所以看起来 :== 是相同的,只是它会检查类型安全性。 - Sam Malayek
1
@LXXIII 普通的赋值运算符“=”确实会检查类型安全性。 - Andrey Tyukin
@LXXIII James Roper的"sbt - A declarative DSL"对我也很有帮助。 - dkim
谢谢@dkim,那篇文章很好。带有:=的行是“表达式,而不是语句”。这在Andrey的回答中得到了详细解释。 - Sam Malayek
1个回答

7

:= 与普通的赋值运算符 = 基本无关。它不是 Scala 的内置操作符,而是一组称为 := 的方法/宏族群。这些方法(或宏)是类成员,如SettingKey[T](类似于TaskKey[T]InputKey[T])。它们消耗 key := value 表达式的右侧,并返回 Def.Setting[T](或类似类型的 Task)实例,其中 T 是键所表示的值的类型。它们通常以中缀符号表示。没有语法糖的话,这些方法/宏的调用会如下所示:

key.:=(value)

构建的“设置”和“任务”是构建定义的基本构建块。
在这里需要理解的重要一点是,左侧的键不是代码块中的某些变量。左侧的键不仅仅代表函数调用的活动堆栈帧中的内存位置(如简单变量所做的那样),而是相当复杂的对象,在构建过程中可以进行检查和传递。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接