12 votes

Comment faire en sorte qu'une tâche sbt utilise un champ de configuration spécifique ?

J'ai une tâche lazy val task = TaskKey[Unit] qui prend un lazy val setting = SettingKey[String] comme entrée. Je dispose également de trois scopes de configuration différents et indépendants ( config("dev") , config("stage") , config("prod") ) et un build.sbt qui spécifie différentes valeurs pour setting pour chacun des scopes de configuration ( setting in stage := "foo" ... ).

Je m'attendais à ce qu'appeler task en utilisant le préfixe de l'étendue de la configuration, la tâche utiliserait les valeurs de l'étendue de la configuration respective (par ex. >dev:task ferait en sorte que la tâche utilise le setting valeurs de dev en utilisant la commande >stage:task ferait en sorte que la tâche utilise le setting valeurs de stage , ...). Cependant, cela ne semble pas fonctionner.

Comment puis-je forcer task pour utiliser les paramètres d'un champ de configuration spécifique ?

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

6voto

Rob Starling Points 1565

Comme indiqué dans Comment puis-je faire en sorte qu'une clé SBT voit les paramètres de la configuration actuelle ? vous pouvez probablement utiliser inConfig comme suit.

Changez ça :

settings = Defaults.defaultSettings ++ Seq(taskTask)

à ça :

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

et 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 vous êtes intéressé à creuser plus profondément, inConfig est défini dans sbt.Project ( http://harrah.github.io/xsbt/latest/api/index.html#sbt.Project$ ) comme une fonction permettant de "copier un sous-graphe de tâches/réglages dans différentes portées" (comme le décrit @MarkHarrah). Jetez également un coup d'œil à http://eed3si9n.com/sbt-010-guide et descendez jusqu'à "changer les champs d'application" où l'auteur explique comment inConfig(conf)(ss) "ne scande les paramètres dans la conf que lorsqu'ils ne sont pas encore scopés à une configuration".

1voto

0__ Points 23597

Je pense que vous devez écrire quelque chose comme

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

Vous pouvez également définir des clés de tâche distinctes, comme ceci

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X