+=
和 ++=
使用 :=
进行赋值是最简单的转换,但键还有其他方法。如果 SettingKey[T]
中的 T
是一个序列,即键的值类型是一个序列,则可以追加到序列而不是替换它。
+=
将向序列追加单个元素。++=
将连接另一个序列。例如,键 Compile / sourceDirectories
的值为 Seq[File]
。默认情况下,此键的值将包括 src/main/scala
。如果你想在名为 source 的目录中也编译源代码(因为你只需要是非标准的),你可以添加该目录
Compile / sourceDirectories += new File("source")
或者,为了方便起见,使用 sbt 包中的 file()
函数
Compile / sourceDirectories += file("source")
(file()
只是创建一个新的 File
。)
你可以使用 ++=
一次添加多个目录
Compile / sourceDirectories ++= Seq(file("sources1"), file("sources2"))
其中 Seq(a, b, c, ...)
是标准的 Scala 语法,用于构造序列。
要完全替换默认的源目录,当然可以使用 :=
Compile / sourceDirectories := Seq(file("sources1"), file("sources2"))
每当设置使用 :=
、+=
或 ++=
来创建对自身或其他键值的依赖时,它所依赖的值必须存在。如果不存在,sbt 会报错。例如,它可能会显示“对未定义设置的引用”。发生这种情况时,请确保你正在 范围中使用该键,该范围定义了它。
可以创建循环,这是一个错误;sbt 会在这样做时告诉你。
你可以计算一些任务或设置的值来定义或追加另一个任务的值。这是通过将 Def.task
用作 :=
、+=
或 ++=
的参数来完成的。
作为第一个例子,考虑使用项目基目录和编译类路径追加源代码生成器。
Compile / sourceGenerators += Def.task {
myGenerator(baseDirectory.value, (Compile / managedClasspath).value)
}
+=
和 ++=
其他键可以在追加到现有设置或任务时使用,就像它们可以用于使用 :=
进行赋值一样。
例如,假设你有一个以项目命名的覆盖率报告,你想将其添加到由 clean 删除的文件中
cleanFiles += file("coverage-report-" + name.value + ".txt")