scala - 如何使 sbt 任务使用特定的配置范围?

标签 scala build scope sbt

我有一个任务 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 将使任务使用来自 settingdev 值,使用命令 >stage:task 将使任务使用 setting 值从 stage ,...)。但是,这似乎不起作用。

如何强制 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)
}

最佳答案

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) 如何“仅在尚未将设置范围限定为配置时将设置 ss 限定为 conf”。

关于scala - 如何使 sbt 任务使用特定的配置范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11845176/

相关文章:

java - 在 SBT 中,可以自动命名私有(private)包吗?

Javascript - 无法理解闭包

javascript - 为什么全局变量似乎不受内部范围(Javascript)的影响?

AngularJS 和 Angular-UI Bootstrap 选项卡作用域

java - 将 ProGuard 设置为仅混淆我的应用程序包

build - 如何执行 Jenkins 构建作业作为另一个作业构建的一部分

scala - SBT:从 Jar 中排除类

java - 您将如何在(惯用的)scala 中编写此 java 代码?

scala - 副作用单子(monad)的测试定律

java - 如何使用 pom.xml 将参数传递给 Maven 构建?