Документации для sbt, похоже, здесь действительно не хватает, поэтому я хотел бы получить окончательный ответ на этот вопрос: в чем разница между "+=", "++=", "‹+=", "‹++" =" и "‹‹=" при работе с ключами?
Примеры использования различных операторов sbt Key
Ответы (3)
Вы не можете найти документацию, потому что, как правильно указал @JacekLaskowski, все операторы, кроме +=
, ++=
и :=
, устарели.
Однако вы можете найти Документация, если вы переключитесь на более старую версию sbt.
Однако, если вы застряли на более старой версии, это их значение (из документации):
+=
и++=
добавлять к предыдущему значению, где сначала добавляется один элемент, а затем добавляетсяSeq
~=
преобразует значение, например вы хотите использовать значение, сохраненное в настройке, чтобы получить новую настройку.<<=
зависит от другого ключа, например, если вы вызываетеorganization <<= name
, то значениеorganization
равно значениюname
. Вы можете зависеть от нескольких значений, например.organization <<= (name, version) { (n, v) => /* do something with values */ }
<+=
и<++=
добавляются с зависимости, такие как добавление, но вы можете использовать другое значение параметра для вычисления нового значения
Сказал, что @JacekLaskowski прав, и если вы используете sbt 13.x или выше, вам не нужно использовать эти операторы в пользу макросов.
Цитирование Задача v. Настройка ключи:
Говорят, что
TaskKey[T]
определяет задачу.Карта sbt, описывающая проект, может содержать фиксированное строковое значение для параметра, такого как
name
, но она должна содержать некоторый исполняемый код для такой задачи, какcompile
— даже если этот исполняемый код в конечном итоге возвращает строку, он должен быть каждый раз запускать заново.Данный ключ всегда относится либо к задаче, либо к простой настройке. То есть «задачность» (будь то перезапускаться каждый раз) — это свойство ключа, а не значения.
Другими словами, настройки неизменяемы и инициализируются при запуске сборки (аналогично val
s в Scala), а задачи выполняются каждый раз при их вызове (аналогично def
s в Scala).
Цитирование Определение задач и настроек а>:
Используя
:=
, вы можете присвоить значение настройке и вычисление задаче. Для параметра значение будет вычисляться один раз во время загрузки проекта. Для задачи вычисление будет выполняться повторно каждый раз при выполнении задачи.
Цитирование Добавление к предыдущим значениям: += и ++=:
Присваивание с помощью
:=
— самое простое преобразование, но у ключей есть и другие методы. ЕслиT
вSettingKey[T]
является последовательностью, то есть тип значения ключа является последовательностью, вы можете добавить к последовательности, а не заменить ее.
+=
добавит один элемент к последовательности.++=
соединит другую последовательность.
Подводя итог, вы должны иметь дело только с :=
(макрос присваивания), +=
(макрос добавления) и ++=
(макрос конкатенации). Остальные, то есть <<=
, <+=
и <++=
, больше не рекомендуются для обычных случаев использования.
Фактически, все операции могут быть выражены с помощью простого макроса присваивания :=
(перефразируя готовящуюся книгу SBT в действии< /а>).
Вы действительно уверены, что документации здесь действительно не хватает?! Я сомневаюсь.
resourceGenerators in Compile <+= makeVersionProperties
например.
- person Readren; 27.04.2016
Когда операторы устарели, есть ли какая-либо документация или руководство по переносу, что они означают или как перевести их в используемый в настоящее время синтаксис?
Вы можете увидеть пример такого перевода в недавних (декабрь 2016 г.) коммитах (в самой scala/scala), например:
- fd3610c: избегайте устаревших операторов sbt 0.12,
- c6e79dd: избегайте еще двух устаревших операторов sbt 0.12
Ты увидишь:
- incOptions <<= (incOptions in LocalProject("root")),
+ incOptions := (incOptions in LocalProject("root")).value,
or
- packagedArtifact in (Compile, packageBin) <<= (artifact in (Compile, packageBin), bundle).identityMap,
+ packagedArtifact in (Compile, packageBin) := (((artifact in (Compile, packageBin)).value, bundle.value)),
Вы можете узнать больше об устаревании этих операторов в sbt PR 2711, sbt PR 2716 и sbt/notes/0.13.13/ops_deprecation.md
.