2012-08-07 71 views
9

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

我预计使用的配置范围前缀将使任务使用的值从各自的配置范围(调用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" 

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

回答

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 
+0

所以它是不可能在运行时决定使用什么样的配置范围,一个有定义每个可能的配置任务? – esarbe 2012-08-07 13:56:37

+0

我不确定。但是你可以多次使用'map'的_same function_(任务主体)。不是这里的专家,所以也许等待更多评论。 – 2012-08-07 13:59:02

+0

好吧,这是一个开始!谢谢! :d – esarbe 2012-08-07 14:02:11

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)) 

就万事大吉了:

$ 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设置SS只有当它尚未作用域的配置”。

相关问题