scala - 如何使 sbt 任务使用特定的配置范围?

我有一个任务 lazy val task = TaskKey[Unit],它以 lazy val setting = SettingKey[String] 作为输入。我还有三个不同的、独立的配置范围( config("dev")config("stage")config("prod") )和一个 build.sbt 文件,该文件为每个配置范围( setting ... )指定了 setting in stage := "foo" 的不同值。

我希望使用配置范围前缀调用 task 将使任务使用来自相应配置范围的值(例如,>dev:task 将使任务使用来自 settingdev 值,使用命令 >stage:task 将使任务使用 setting 值从 stage ,...)。但是,这似乎不起作用。

如何强制 task 使用来自特定配置范围的设置?

build.sbt:

setting := "default setting"

setting in stage := "stage setting"

setting in prod  := "prod setting"

构建.scala:

import sbt._
import Keys._

object TaskBuild extends Build {
  val setting = SettingKey[String]("setting", "a simple string setting")

  val task = TaskKey[Unit]("task", "a simple task experiment")

  val taskTask = task <<= setting map { s: String =>
    println("Setting is: " + s)
  }

  lazy val dev = config("dev") describedAs("dev environment settings")
  lazy val stage = config("stage") describedAs("stage environment settings")
  lazy val prod = config("prod") describedAs("prod environment settings")

  lazy val root = Project(
    "project",
     file("."),
     settings = Defaults.defaultSettings ++ Seq(taskTask)
  )
  .configs(dev, stage, prod)
}

最佳答案

如 How can i make an SBT key see settings for the current configuration? 中所述,你大概可以像下面这样使用inConfig

改变这个:

settings = Defaults.defaultSettings ++ Seq(taskTask)

到这里:

settings = Defaults.defaultSettings ++
  Seq(taskTask) ++
  inConfig(dev)(Seq(taskTask)) ++
  inConfig(stage)(Seq(taskTask)) ++
  inConfig(prod)(Seq(taskTask))

然后瞧:

$ sbt
> task
Setting is: default setting
> dev:task
Setting is: default setting
> stage:task
Setting is: stage setting
> prod:task
Setting is: prod setting

如果您有兴趣深入挖掘,inConfigsbt.Project (http://harrah.github.io/xsbt/latest/api/index.html#sbt.Project$) 中定义为“复制任务/设置子图”的函数进入不同的范围”(正如@MarkHarrah 所描述的那样)。另外,看看http://eed3si9n.com/sbt-010-guide并向下滚动到“更改范围”,其中作者解释了 inConfig(conf)(ss) 如何“仅在尚未将设置范围限定为配置时将设置 ss 限定为 conf”。

https://stackoverflow.com/questions/11845176/

相关文章:

android - 有没有办法让 Android NDK-build 使用更新版本的 gcc?

visual-studio-2010 - 极简 Qt 构建的推荐标志

javascript - 内联 require.js 文本!使用咕噜声

python - 使用 SCons 进行真正的分层构建?

java - 在行中找不到可执行代码

build - 是否有适用于多种语言的类似 Maven 的工具?

c# - Visual Studio clean 解决方案不会删除所有被移动的 dll/项目引用

msbuild - 为什么我的 .wpp.targets 文件没有应用到我的构建服务器上?

swift - Xcode 10 新构建系统清理问题

visual-studio - 如何更改 Visual Studio 中构建命令的默认行为