加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 08:47:34 所属栏目:安全 来源:网络整理
导读:我想仅在计算SettingKey a1时覆盖SettingKey b的值. 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 rootP
我想仅在计算SettingKey a1时覆盖SettingKey b的值.

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

比上面更好的现实世界示例是,当您只想在运行时配置中为构建添加一些资源时,以及在打包应用程序时添加一些其他资源.例如,在开发模式期间和生产期间由服务器服务的构建GWT app公共资源是不同的.例如,为运行和包任务自定义设置资源目录会很好.

解决方法

您需要设置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将“寻找”a2Key中bKey的定义,然后,因为它没有“找到”它,所以回退到更一般的bKey(在默认范围内),已定义并因此使用.

编辑:遗憾的是,除非提供a1Key和a2Key设置的定义的人也明确提供了所需的扩展点(以设置范围的依赖关系的形式),否则不能覆盖依赖关系.这至少是我理解它的方式.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读