4

我只想b在计算 SettingKey 时覆盖 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 应用程序公共资源是不同的。resource-directories例如,自定义设置runpackage任务会很好。

4

1 回答 1

2

您首先需要设置a1Keya2Key允许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(在默认范围内),即被定义并因此被使用。

编辑:不幸的是,这意味着,除非提供a1Keya2Key设置的定义的人还明确提供所需的扩展点(以设置范围依赖项的形式),否则您不能覆盖依赖项。至少我是这么理解的。

于 2013-02-03T19:01:03.403 回答