【问题标题】:How to make a sbt task use a specific configuration scope?如何使 sbt 任务使用特定的配置范围?
【发布时间】:2012-08-04 10:06:45
【问题描述】:

我有一个任务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 将使任务使用来自devsetting 值,使用命令@ 987654333@ 将使任务使用来自stagesetting 值,...)。但是,这似乎不起作用。

如何强制task 使用来自特定配置范围的设置?

build.sbt:

setting := "default setting"

setting in stage := "stage setting"

setting in prod  := "prod setting"

构建.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)
}

【问题讨论】:

    标签: scala build scope sbt


    【解决方案1】:

    正如How can i make an SBT key see settings for the current configuration? 中所讨论的,您可能可以使用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
    

    如果您有兴趣深入挖掘,inConfigsbt.Project (http://harrah.github.io/xsbt/latest/api/index.html#sbt.Project$) 中定义为“将任务/设置的子图复制到不同范围”的函数(正如@MarkHarrah 所描述的那样)。另外,查看http://eed3si9n.com/sbt-010-guide 并向下滚动到“更改范围”,作者解释了inConfig(conf)(ss)“仅当尚未将设置范围限定为配置时,才将设置范围限定为 conf”。

    【讨论】:

      【解决方案2】:

      我认为你需要写一些类似的东西

      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
      

      【讨论】:

      • 所以不可能在运行时决定使用什么配置范围,必须为每个可能的配置定义一个任务?
      • 我不确定。但是您可以对map 多次使用相同的功能(任务主体)。这里不是专家,所以也许等待更多的 cmets。
      • 嗯,这是一个开始!谢谢! :D
      猜你喜欢
      • 2015-09-04
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 2014-06-03
      相关资源
      最近更新 更多