scala - 如何覆盖 SettingKey 以计算 sbt 中的另一个 SettingKey?

标签 scala sbt

我想覆盖 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 会很好。对于 runpackage任务。

最佳答案

您需要设置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 (在默认范围内),它已定义并因此使用。

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

关于scala - 如何覆盖 SettingKey 以计算 sbt 中的另一个 SettingKey?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14675660/

相关文章:

scala - 为什么 sbt 构建失败并显示 "MissingRequirementError: object scala.runtime in compiler mirror not found."?

scala - 在 SBT 中无需编译即可获取完整的类路径

scala - 为什么 sbt 在 Play 项目中报告 "value enablePlugins is not a member of sbt.Project"?

jenkins - Jenkins 中使用 sbt 的 Nexus 凭证

Scala:isInstanceOf 后跟 asInstanceOf

java - 为什么从 java.util.HashMap[Long,Long] 获取丢失的键会返回 0L?

scala - joda 时间 ISO 日期时间格式

java - 窃取工作的并行工作似乎并没有窃取太多工作

scala - 在 IntelliJ 中,我在哪里输入 Homebrew Scala 路径/usr/local/opt/scala/idea?

添加为 sbt 依赖项时未找到 jboss 拦截器 api 1.1