我想覆盖 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 应用程序公共(public)资源是不同的。例如自定义设置 resource-directories
会很好。对于 run
和 package
任务。
最佳答案
您需要设置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
settings 还明确提供了所需的扩展点(以设置范围依赖项的形式),您不能覆盖依赖项。至少我是这么理解的。
关于scala - 如何覆盖 SettingKey 以计算 sbt 中的另一个 SettingKey?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14675660/