不同sbt Key运算符的用例

时间:2014-05-15 21:41:10

标签: scala sbt sbt-native-packager

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

3 个答案:

答案 0 :(得分:27)

您无法找到文档,因为@JacekLaskowski正确地指出除+=++=:=之外的所有运算符都已弃用。

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

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

  • +=++= append to previous value,首先附加单个元素,然后附加Seq
  • ~= transforms value,例如您想使用存储在设置中的值来获取新设置。
  • <<= depends on another key,例如,如果您致电organization <<= name,则organization值等于name值。您可以依赖多个值,例如organization <<= (name, version) { (n, v) => /* do something with values */ }
  • <+=<++=appending with dependencies,与附加内容类似,但您可以使用其他设置值来计算新值

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

答案 1 :(得分:4)

引用Task v. Setting keys

  

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

     

sbt描述项目的地图可以保持固定的字符串值   对于诸如name之类的设置,但它必须保留一些可执行文件   compile等任务的代码 - 即使是可执行代码   最终返回一个字符串,每次都必须重新运行。

     

给定密钥始终指任务或普通设置。那   是,“任务”(是否每次重新运行)是一个属性   关键,而不是价值。

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

引用Defining tasks and settings

  

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

引用Appending to previous values: += and ++=

  

使用:=进行分配是最简单的转换,但密钥还有其他转换   方法也是如此。如果T中的SettingKey[T]是一个序列,即   key的值类型是一个序列,你可以追加到序列中   而不是替换它。

     

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

包装它,您应该只关注:=(赋值宏),+=(追加宏)和++=(连接宏)。其余的,即<<=<+=<++=,不再推荐用于常见用例。

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

你真的确定,文档“真的缺少这里”?!我怀疑。

答案 2 :(得分:-1)

  

当运营商被弃用时,是否有任何文档或移植指南是什么意思或如何将它们转换为当前使用的语法?

您可以在最近(2016年12月)提交(scala / scala本身)中看到此类翻译的示例,如:

你会看到:

-  incOptions <<= (incOptions in LocalProject("root")),
+  incOptions := (incOptions in LocalProject("root")).value,

-    packagedArtifact in (Compile, packageBin) <<= (artifact in (Compile, packageBin), bundle).identityMap,
+    packagedArtifact in (Compile, packageBin) := (((artifact in (Compile, packageBin)).value, bundle.value)),

您可以在sbt PR 2711sbt PR 2716sbt/notes/0.13.13/ops_deprecation.md中详细了解这些运营商的弃用情况。