The documentation for sbt seems to be really lacking here, so I\'d like to get a definitive answer on this: what is the difference between \"+=\", \"++=\", \"<+=\", \"<++=
Quoting Task v. Setting keys:
A
TaskKey[T]
is said to define a task.sbt's map describing the project can keep around a fixed string value for a setting such as
name
, but it has to keep around some executable code for a task such ascompile
-- even if that executable code eventually returns a string, it has to be re-run every time.A given key always refers to either a task or a plain setting. That is, "taskiness" (whether to re-run each time) is a property of the key, not the value.
In other words, settings are immutable and initialized at build startup (similar to val
s in Scala) while tasks are executed every time they're called (similar to def
s in Scala).
Quoting Defining tasks and settings:
Using
:=
, you can assign a value to a setting and a computation to a task. For a setting, the value will be computed once at project load time. For a task, the computation will be re-run each time the task is executed.
Quoting Appending to previous values: += and ++=:
Assignment with
:=
is the simplest transformation, but keys have other methods as well. If theT
inSettingKey[T]
is a sequence, i.e. the key's value type is a sequence, you can append to the sequence rather than replacing it.
+=
will append a single element to the sequence.++=
will concatenate another sequence.
Wrapping it up, you should only be concerned with :=
(assignment macro), +=
(append macro) and ++=
(concatenation macro). The remaining ones, i.e. <<=
, <+=
and <++=
, are no longer recommended for common use cases.
As a matter of fact, all operations can be expressed with the simple assignment macro :=
(paraphrasing the upcoming book SBT in Action).
Are you really sure, the docs are "really lacking here"?! I doubt.