我有一个任务 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
值,使用命令 >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
如果您有兴趣深入挖掘,inConfig
在 sbt.Project
(http://harrah.github.io/xsbt/latest/api/index.html#sbt.Project$) 中定义为“复制任务/设置子图”的函数进入不同的范围”(正如@MarkHarrah 所描述的那样)。另外,看看http://eed3si9n.com/sbt-010-guide并向下滚动到“更改范围”,其中作者解释了 inConfig(conf)(ss)
如何“仅在尚未将设置范围限定为配置时将设置 ss 限定为 conf”。
关于scala - 如何使 sbt 任务使用特定的配置范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11845176/