我有一个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
会使任务使用setting
中的dev
值{1}},使用命令>stage:task
可以使任务使用setting
中的stage
值,...)。但是,这似乎不起作用。
如何强制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)
}
答案 0 :(得分:5)
正如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))
和voilà:
$ sbt
> task
Setting is: default setting
> dev:task
Setting is: default setting
> stage:task
Setting is: stage setting
> prod:task
Setting is: prod setting
如果您有兴趣深入挖掘,inConfig
在sbt.Project
(http://harrah.github.io/xsbt/latest/api/index.html#sbt.Project$)中定义为“将任务/设置的子图复制到不同范围”的功能(如@MarkHarrah描述它)。另外,请查看http://eed3si9n.com/sbt-010-guide并向下滚动到“更改范围”,其中作者解释了inConfig(conf)(ss)
“将设置范围限定为只有当它没有作用于配置时才设置为”
答案 1 :(得分: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