2012-08-07 9 views
9

Ho un compito lazy val task = TaskKey[Unit] che accetta come input lazy val setting = SettingKey[String]. Ho anche tre diversi ambiti di configurazione indipendenti (config("dev"), config("stage"), config("prod")) e un file build.sbt che specifica valori diversi per setting per ciascuno degli ambiti di configurazione (setting in stage := "foo" ...).Come fare un task sbt utilizzare un ambito di configurazione specifico?

I prevede che chiamare task utilizzando il prefisso portata config renderebbe il compito utilizzare i valori dall'ambito rispettiva configurazione (es >dev:task renderebbe il compito utilizza i valori setting da dev, utilizzando il comando >stage:task renderebbe usa il compito setting valori da stage, ...). Tuttavia, questo non sembra funzionare.

Come è possibile forzare task per utilizzare le impostazioni da un ambito di configurazione specifico?

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

risposta

1

Penso che avete bisogno di scrivere qualcosa di simile

val devTaskSetting = task <<= setting in dev map { s: String => 
    println("Setting in Dev is: " + s) 
} 

È inoltre possibile definire le chiavi di attività separati, come questo

val devTask = TaskKey[Unit]("task", "a simple task experiment") in dev 
val stageTask = TaskKey[Unit]("task", "a simple task experiment") in stage 
+0

Quindi non è possibile decidere in fase di esecuzione quale ambito di configurazione utilizzare, si deve definire un'attività per ogni configurazione possibile? – esarbe

+0

Non sono sicuro. Ma è possibile utilizzare la funzione _same_ (corpo del task) per 'map' più volte. Non è un esperto qui, quindi forse aspetta altri commenti. –

+0

Beh, è ​​un inizio! Grazie! : D – esarbe

5

Come discusso in How can i make an SBT key see settings for the current configuration?, è possibile utilizzare probabilmente inConfig come segue.

Modifica questo:

settings = Defaults.defaultSettings ++ Seq(taskTask) 

a questo:

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

e 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 

Se siete interessati a scavare più in profondità, inConfig è definito in sbt.Project (http://harrah.github.io/xsbt/latest/api/index.html#sbt.Project$) come una funzione per "copiare un sottografo di compiti/impostazioni in diversi ambiti "(come lo descrive @MarkHarrah). Inoltre, dai uno sguardo allo http://eed3si9n.com/sbt-010-guide e scorri verso il basso fino a "cambiare gli ambiti" in cui l'autore spiega come lo spettro inConfig(conf)(ss) "scopa le impostazioni in conf solo quando non è ancora collegato ad una configurazione".

Problemi correlati