build.sbt 中的 SBT := 运算符是什么?

Sam*_*yek 2 scala operators sbt

我是 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.")
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

And*_*kin 5

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

key.:=(value)
Run Code Online (Sandbox Code Playgroud)

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

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