+=
y ++=
La asignación :=
es la transformación más simple, pero las claves tienen
también otros métodos. Si T
en SettingKey[T]
es una secuencia, es decir,
si el tipo del valor de una clave es una secuencia, podrás añadir elementos a la
secuencia en lugar de reemplazarla.
+=
añadirá un único elemento a la secuencia
++=
concatenará otra secuencia
Por ejemplo, la clave Compile / sourceDirectories
tiene un Seq[File]
por
valor. De forma predeterminada el valor de esta clave incluye src/main/scala
.
Si quieres que además se compile el código fuente de un directorio llamado
source (en el caso de que por ejemplo no utilices una estructura de directorios
estándar) podrás añadir dicho directorio:
Compile / sourceDirectories += new File("source")
O convenientemente puedes utilizar la función file()
del paquete sbt.
Compile / sourceDirectories += file("source")
(file()
crea un nueva instancia de File
)
Puedes usar ++=
para añadir más de un directorio a la vez:
Compile / sourceDirectories ++= Seq(file("sources1"), file("sources2"))
Donde Seq(a, b, c, ...)
es la sintaxis estándar de Scala para construir una
secuencia.
Por supuesto, para reemplazar totalmente los directorios de código fuente
predeterminados puedes seguir utilizando :=
:
Compile / sourceDirectories := Seq(file("sources1"), file("sources2"))
Cuando una entrada utiliza :=
, +=
o ++=
para crear una dependencia sobre
sí misma o sobre el valor de otra clave, el valor sobre el que depende debe
existir. De lo contrario sbt se quejará. Puede que por ejemplo diga
“Reference to undefined setting“. Cuando esto suceda asegúrate de que estás
utilizando la clave en el ámbito donde está definida.
Es posible crear referencias circulares, lo cual es un error. sbt te lo dirá si lo haces.
Puedes calcular el valor de algunas tareas o entradas definiendo o añadiendo
el valor de otra tarea. Esto se hace utilizando Def.task
como argumento de
:=
, +=
, or ++=
.
Como ejemplo, considera añadir un generador de código fuente utilizando el directorio base del proyecto y el classpath de compilación.
Compile / sourceGenerators += Def.task {
myGenerator(baseDirectory.value, (Compile / managedClasspath).value)
}
+=
y ++=
Otras claves pueden ser utilizadas cuando se añade a una entrada o tarea
existente, al igual que se hacía para asignar con :=
.
Por ejemplo, digamos que tienes un informe de cobertura de código cuyo nombre
se basa en el nombre del proyecto y que quieres añadirlo a la lista de ficheros
que se borran cuando se invoca clean
:
cleanFiles += file("coverage-report-" + name.value + ".txt")