我想在计算SettingKey b
时覆盖SettingKey a1
的值。
import sbt._
import sbt.Keys._
object Build extends Build {
val a1Key = SettingKey[String]("a1", "")
val a2Key = SettingKey[String]("a2", "")
val bKey = SettingKey[String]("b", "")
lazy val rootProject = Project("P", file(".")).settings(
bKey := "XXX",
a1Key <<= bKey((x) => ">>>"+x+"<<<"),
a2Key <<= bKey((x) => ">>>"+x+"<<<")
) .settings(
bKey in a1Key := "YYY" //providing custom value in setting scope
)
}
目前的结果是
> a1
[info] >>>XXX<<<
> a2
[info] >>>XXX<<<
> b
[info] XXX
...但我的目标是将YYY
视为a1
的价值:
> a1
[info] >>>YYY<<<
> a2
[info] >>>XXX<<<
> b
[info] XXX
比上面更好的真实世界示例是当您只想在runtime
配置中为构建添加一些资源时,以及在打包应用程序时添加一些其他资源。例如,在开发模式期间和生产期间由服务器服务的构建GWT app公共资源是不同的。例如,为resource-directories
和run
任务自定义设置package
会很好。
答案 0 :(得分:2)
您需要设置a1Key
和a2Key
以允许首先覆盖bKey
:
lazy val rootProject = Project("P", file(".")).settings(
bKey := "Fnord",
a1Key <<= (bKey in a1Key)(x => ">>>" + x + "<<<"),
a2Key <<= (bKey in a2Key)(x => ">>>" + x + "<<<")
).settings(
bKey in a1Key := "Meep"
)
这样,计算a1Key
将使用更具体的值Meep
,而在计算a2Key
时,sbt将“寻找”bKey in a2Key
的定义然后,因为它没有“找到”它,而是回到更一般的bKey
(在默认范围内),它被定义并因此被使用。
修改:这不幸意味着,除非提供a1Key
和a2Key
设置定义的人也明确提供所需的扩展点(以设置的形式 - 作用域依赖项),您不能覆盖依赖项。这至少是我理解它的方式。