SBT中的<<运营商解释

时间:2016-03-13 20:56:00

标签: scala sbt

我正在寻找对<<=运算符在SBT中如何工作的完整理解。

从SBT&#39; API,它似乎接受Initialize[T]类型并解析为Setting[T]。我认为这允许用户在给定其他Settingkey的值的情况下初始化SettingKey的值。文档中没有更多内容......关于这个话题。

以下代码正确解析了发布存储库,具体取决于version的值,但它是如何工作的?

publishTo <<= version { (v: String) =>
    if (v.trim.endsWith("SNAPSHOT"))
        Some("Artifactory Realm" at "http://artifactory.erfangc.io/artifactory/libs-snapshot-local;build.timestamp=" + new java.util.Date().getTime)
    else
        Some("Artifactory Realm" at "http://artifactory.erfangc.io/artifactory/libs-release-local")
}

具体来说,它与以下内容有何不同:

publishTo := {
    if (version.value.trim.endsWith("SNAPSHOT"))
        Some("Artifactory Realm" at "http://artifactory.erfangc.io/artifactory/libs-snapshot-local;build.timestamp=" + new java.util.Date().getTime)
    else
        Some("Artifactory Realm" at "http://artifactory.erfangc.io/artifactory/libs-release-local")
}

1 个答案:

答案 0 :(得分:2)

这两种形式是等价的。正如您所说,目的是在另一个设置的定义中使用一个设置的结果。在内部,这意味着sbt建立了从versionpublishTo的依赖关系。

第二种形式,您使用另一个设置的.value块内的:= { }“评估”设置,会触发一个宏,它会像第一个表单一样重写树。之所以引入这种语法,是因为<<=运算符(以及相关的<+=)难以理解和记忆,特别是对于sbt的新手。

请注意,在您的示例中,您还可以编写if (isSnapshot.value) Some(...) else Some(...)。这是一个辅助设置,用于检查"SNAPSHOT"中的version