12

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

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

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

构建.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)
}
4

2 回答 2

6

我如何使 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)“仅在尚未确定范围时将设置范围限定为 conf一个配置”。

于 2013-07-05T08:18:39.707 回答
1

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

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
于 2012-08-07T13:38:24.213 回答