我正在寻找对<<=
运算符在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")
}
答案 0 :(得分:2)
这两种形式是等价的。正如您所说,目的是在另一个设置的定义中使用一个设置的结果。在内部,这意味着sbt建立了从version
到publishTo
的依赖关系。
第二种形式,您使用另一个设置的.value
块内的:= { }
“评估”设置,会触发一个宏,它会像第一个表单一样重写树。之所以引入这种语法,是因为<<=
运算符(以及相关的<+=
)难以理解和记忆,特别是对于sbt的新手。
请注意,在您的示例中,您还可以编写if (isSnapshot.value) Some(...) else Some(...)
。这是一个辅助设置,用于检查"SNAPSHOT"
中的version
。