不同sbt Key运算符的用例

Jef*_*eff 17 scala sbt sbt-native-packager

sbt的文档似乎在这里真的缺乏,所以我想对此得到一个明确的答案:"+ =","++ =","<+ =","<++之间的区别是什么?在Keys上操作时,""和"<< ="?

lpi*_*ora 27

你找不到文档,因为@JacekLaskowski正确地指出除了和之外的所有运算符+=,++=并且:=已被弃用.

但是,如果切换到旧版本的sbt,则可以找到文档.

如果您坚持使用旧版本,这是他们的意思(通过文档):

  • +=++= 附加到先前的值,其中第一附加单个元件和下附加一个Seq
  • ~= 转换值,例如,您希望使用存储在设置中的值来获取新设置.
  • <<= 取决于另一个键,例如,如果您调用organization <<= name,则organizationvalue等于namevalue.您可以依赖多个值,例如organization <<= (name, version) { (n, v) => /* do something with values */ }
  • <+=<++=正在与依赖附加,如追加,但你可以使用其他的设置值来计算新值

说,@ JacekLaskowski是对的,如果你使用sbt 13.x或更高版本,你不应该使用这些运算符来支持宏.

  • 这就是我想要的,谢谢.我之所以需要知道的原因是sbt的其他插件的文档仍然使用"不赞成"的运算符(例如,sbt-native-packager).由于我是sbt的新手,并且只使用了0.13+,因此我从未接触过较旧的语法.这非常有帮助. (2认同)

Jac*_*ski 5

引用任务 v. 设置键

TaskKey[T]据说A定义了一个任务。

sbt 的描述项目的映射可以保留一个固定的字符串值,例如设置name,但它必须保留一些用于任务的可执行代码,例如compile- 即使该可执行代码最终返回一个字符串,它也必须重新 -每次都跑。

给定的键总是指任务或普通设置。也就是说,“taskiness”(是否每次重新运行)是键的属性,而不是值。

换句话说,设置是不可变的,并在构建启动时初始化(类似于valScala 中的 s),而每次调用任务时都会执行任务(类似于defScala 中的 s)。

引用定义任务和设置

使用:=,您可以为设置分配值并为任务分配计算。对于设置,该值将在项目加载时计算一次。对于任务,每次执行任务时都会重新运行计算。

引用附加到以前的值: += 和 ++=

赋值 with:=是最简单的转换,但键也有其他方法。如果TinSettingKey[T]是一个序列,即键的值类型是一个序列,您可以附加到该序列而不是替换它。

+=将单个元素附加到序列中。 ++=将连接另一个序列。

总结一下,你应该只关心:=(assignment macro), +=(append macro) 和++=(concatenation macro)。其余的,即<<=<+=<++=,不再推荐用于常见用例。

事实上,所有操作都可以用简单的赋值宏来表达:=(解释即将出版的SBT in Action一书)。

你真的确定,这些文档“真的很缺乏”?!我怀疑。

  • 事实上,即使是“SBT in Action”一书中的示例也使用了已弃用的运算符。看[这里](https://github.com/jsuereth/sbt-in-action-examples/blob/master/chapter3/build.sbt)。例如,Compile &lt;+= makeVersionProperties 中的行 `resourceGenerators`。 (2认同)