如何使SBT任务中使用一个特定的配置范围是什么?(How to make a sbt task us

2019-06-26 20:32发布

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

我预计,调用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)
}

Answer 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


Answer 2:

正如在讨论怎样才能使我对当前配置的SBT关键看设置? ,你也许可以使用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

如果你有兴趣在更深的挖掘, inConfig被定义sbt.Project ( http://harrah.github.io/xsbt/latest/api/index.html#sbt.Project$ )作为功能“复制子任务/设置成不同的范围”(如@MarkHarrah描述它)。 另外,看看http://eed3si9n.com/sbt-010-guide ,向下滚动到“更改范围”在这里笔者介绍了如何inConfig(conf)(ss) “,在作用域的设置SS到的conf只有当它还没有作用域的配置”。



文章来源: How to make a sbt task use a specific configuration scope?