不同 sbt Key 操作符的用例

Posted

技术标签:

【中文标题】不同 sbt Key 操作符的用例【英文标题】:Use cases for different sbt Key operators 【发布时间】:2014-07-04 13:07:06 【问题描述】:

这里似乎真的缺少 sbt 的文档,所以我想得到一个明确的答案:"+="、"++="、"

【问题讨论】:

您是否介意支持声明“这里似乎真的缺少 sbt 的文档”? scala-sbt.org/release/docs/Getting-Started/…呢? 我已经阅读了 sbt 网站上的所有文档,并且我还购买并阅读了 MEAP 版本的“SBT In Action”。 := 和 += 和 ++= 等常见运算符定义明确,但 【参考方案1】:

您找不到文档,因为 @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,和 append 一样,但是你可以使用别人的设置值来计算新值

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

【讨论】:

这就是我要找的,谢谢。我需要知道的原因是其他 sbt 插件的文档仍然使用“已弃用”运算符(例如,sbt-native-packager)。由于我是 sbt 的新手并且只使用过 0.13+,因此我从未接触过旧语法。这很有帮助。 这些release notes for migrating from 0.12.x 对我了解如何摆脱已弃用的运算符非常有帮助。【参考方案2】:

引用Task v. Setting keys:

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

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

给定的键总是指一个任务或一个简单的设置。那 也就是说,“taskiness”(是否每次都重新运行)是 键,而不是值。

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

引用Defining tasks and settings:

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

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

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

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

总结一下,你应该只关心:=(赋值宏)、+=(附加宏)和++=(连接宏)。其余的,即<<=<+=<++=,不再推荐用于常见用例。

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

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

【讨论】:

我同意很难在 sbt 文档中找到特定信息,尽管随着时间的推移文档已经有了很大的改进。难道是sbt如此简单抽象以至于无法形容?总之,无法记录? sbt-web 在任何地方都使用不推荐使用的运算符。因此,要了解它的作用以及如何使用它,需要知道操作员的意思。并且 sbt API 文档的 cmets 为零。即使是未弃用的。这非常令人沮丧,并且降低了我说服老板在我们的新项目中使用 scala 和 sbt 的希望。 事实上,即使是“SBT in Action”一书中的示例也使用了已弃用的运算符。看here。以resourceGenerators in Compile <+= makeVersionProperties 行为例。 当运算符被弃用时,是否有任何文档或移植指南它们的含义或如何将它们转换为当前使用的语法?【参考方案3】:

当运算符被弃用时,是否有任何文档或移植指南它们的含义或如何将它们转换为当前使用的语法?

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

fd3610c: avoid deprecated sbt 0.12 operators, c6e79dd: Avoid 2 more deprecated sbt 0.12 operators

你会看到:

-  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 2711、sbt PR 2716 和 sbt/notes/0.13.13/ops_deprecation.md 中查看有关弃用这些运算符的更多信息。

【讨论】:

以上是关于不同 sbt Key 操作符的用例的主要内容,如果未能解决你的问题,请参考以下文章

python的文件操作及简单的用例

unittst用例操作

MongoDB中updateOne超过findOneAndUpdate的用例[重复]

UML用例图

utp

bash中noop [:]的用例是啥?