build.sbt 中的 SBT := 运算符是什么?
What is the SBT := operator in build.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.")
它在这个较大的代码片段中使用了几次:
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)
我最好的猜测是它的意思是 "declare if not already declared"。
:=
本质上与普通赋值运算符=
无关。它不是内置的 Scala 运算符,而是一个名为 :=
的 methods/macros 家族。这些方法(或宏)是 类 的成员,例如 SettingKey[T]
(similarly for TaskKey[T]
and InputKey[T]
). They consume the right hand side of the key := value
expression, and return instances of type Def.Setting[T]
(或类似地,Task
s),其中 T
是键表示的值的类型。它们通常以中缀表示法书写。如果没有语法糖,这些 methods/macros 的调用将如下所示:
key.:=(value)
构造的 Setting
s 和 Task
s 又是构建定义的基本构建块。
这里要理解的重要一点是,左侧的键不是代码块中的一些变量。左边的键不是仅仅表示函数调用的活动堆栈帧中的内存位置(就像一个简单的变量那样),而是相当复杂的对象,可以在构建过程中检查和传递。
我是 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)
我最好的猜测是它的意思是 "declare if not already declared"。
:=
本质上与普通赋值运算符=
无关。它不是内置的 Scala 运算符,而是一个名为 :=
的 methods/macros 家族。这些方法(或宏)是 类 的成员,例如 SettingKey[T]
(similarly for TaskKey[T]
and InputKey[T]
). They consume the right hand side of the key := value
expression, and return instances of type Def.Setting[T]
(或类似地,Task
s),其中 T
是键表示的值的类型。它们通常以中缀表示法书写。如果没有语法糖,这些 methods/macros 的调用将如下所示:
key.:=(value)
构造的 Setting
s 和 Task
s 又是构建定义的基本构建块。
这里要理解的重要一点是,左侧的键不是代码块中的一些变量。左边的键不是仅仅表示函数调用的活动堆栈帧中的内存位置(就像一个简单的变量那样),而是相当复杂的对象,可以在构建过程中检查和传递。