2012-08-07 8 views
9

Tengo una tarea lazy val task = TaskKey[Unit] que toma lazy val setting = SettingKey[String] como entrada. También tengo tres ámbitos de configuración distintos e independientes (config("dev"), config("stage"), config("prod")) y un archivo build.sbt que especifica diferentes valores para setting para cada uno de los ámbitos de configuración (setting in stage := "foo" ...).¿Cómo hacer que una tarea sbt use un alcance de configuración específico?

que esperaba que llamar task utilizando el prefijo alcance config haría que la tarea utilice los valores de los respectivos ámbitos de configuración (por ejemplo >dev:task haría que la tarea utilice los setting valores de dev, usando el comando >stage:task haría que la tarea utilice el setting valores de stage, ...). Sin embargo, esto no parece funcionar.

¿Cómo puedo forzar task para usar la configuración desde un ámbito de configuración específico?

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

Respuesta

1

Creo que se necesita para escribir algo así como

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

También puede definir teclas de tareas separadas, como

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

Por lo tanto, no es posible decidir en el tiempo de ejecución qué ámbito de configuración usar, ¿hay que definir una tarea para cada configuración posible? – esarbe

+0

No estoy seguro. Pero puede usar la _máxima función_ (cuerpo de la tarea) para 'mapa' varias veces. No es un experto aquí, así que quizás espere más comentarios. –

+0

¡Bien, es un comienzo! ¡Gracias! :RE – esarbe

5

Como se discutió en How can i make an SBT key see settings for the current configuration?, probablemente pueda usar inConfig de la siguiente manera.

cambiar esta situación:

settings = Defaults.defaultSettings ++ Seq(taskTask) 

a esto:

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

y 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 

Si usted está interesado en la excavación más profunda, inConfig se define en sbt.Project (http://harrah.github.io/xsbt/latest/api/index.html#sbt.Project$) como una función para "copiar un subgráfico de tareas/configuraciones en diferentes ámbitos "(como @MarkHarrah lo describe). Además, consulte http://eed3si9n.com/sbt-010-guide y desplácese hacia abajo hasta "cambiar los ámbitos" donde el autor explica cómo inConfig(conf)(ss) "determina las configuraciones ss para confirmar solo cuando aún no tiene un alcance para una configuración".

Cuestiones relacionadas