2012-08-07 6 views
9

私は入力としてlazy val setting = SettingKey[String]を取るlazy val task = TaskKey[Unit]というタスクを持っています。また、構成スコープ(setting in stage := "foo" ...)ごとに異なるsettingの異なる値を指定する3つの異なる独立した構成スコープ(config("dev"),config("stage")config("prod"))とbuild.sbtファイルもあります。どのように特定の構成スコープを使用するsbtタスクを作成するには?

は私が期待されるタスクは、(それぞれの設定範囲から値を使用するだろうコンフィグスコープ接頭辞を使用してtaskを呼び出すなど>dev:taskタスクは、タスクがsettingを使用するだろうコマンド>stage:taskを使用して、devから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

+0

わかりません。しかし、 'map'に対して_same function_(タスク本体)を複数回使用することができます。ここでは専門家ではないので、もっとコメントを待つかもしれません。 –

+0

さて、これは始まりです!ありがとう! :D – esarbe

5

How can i make an SBT key see settings for the current configuration?で説明したように、おそらくinConfigを次のように使用できます。

変更この:

settings = Defaults.defaultSettings ++ 
    Seq(taskTask) ++ 
    inConfig(dev)(Seq(taskTask)) ++ 
    inConfig(stage)(Seq(taskTask)) ++ 
    inConfig(prod)(Seq(taskTask)) 

出来上がり:これまで

settings = Defaults.defaultSettings ++ 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に設定する方法を説明します。

関連する問題