如何使 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会使任务使用dev中的setting值,使用命令>stage:task将使任务使用stage中的setting值,...)。但是,这似乎不起作用。

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

build.sbt:

setting := "default setting"
setting in stage := "stage setting"
setting in prod  := "prod setting"

Build.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)
}

如如何使 SBT 键查看当前配置的设置?中所述,您可能可以使用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

"。

我认为你需要写类似的东西

val devTaskSetting = task <<= setting in dev map { s: String =>
   println("Setting in Dev is: " + s)
}

您还可以定义单独的任务键,如下所示

val devTask   = TaskKey[Unit]("task", "a simple task experiment") in dev
val stageTask = TaskKey[Unit]("task", "a simple task experiment") in stage

最新更新