多个SBT配置应该是互斥的,但它们都同时激活-为什么?

时间:2018-09-14 16:58:47

标签: scala sbt

我用两个自定义配置文件“ dev”和“ staging”(SBT似乎称之为“配置”)定义了一个最小的build.sbt。但是,当我使用在文件(dev)中首先定义的Configuration运行SBT时,将同时执行两个Configuration块-如果两个都修改相同的设置,则最后一个将获胜(登台)。

这似乎破坏了任何条件激活的概念,那么SBT我在做什么错了?

作为参考,我想模拟条件激活的Maven Profiles概念,例如mvn test -P staging

SBT版本:1.2.1

build.sbt

name := "example-project"
scalaVersion := "2.12.6"
...

fork := true

// Environment-independent JVM property (always works)
javaOptions += "-Da=b"

// Environment-specific JVM property (doesn’t work)
lazy val Dev = config("dev") extend Test
lazy val Staging = config("staging") extend Test
val root = (project in file("."))
  .configs(Dev, Staging)
  .settings(inConfig(Dev)(Seq(javaOptions in Test += "-Dfoo=bar")))
  .settings(inConfig(Staging)(Seq(javaOptions in Test += "-Dfoo=qux")))

命令:

# Bad
sbt test
  => foo=qux
     a=b

# Bad
sbt clean dev:test
  => foo=qux
     a=b

# Good
sbt clean staging:test
  => foo=qux
     a=b

1 个答案:

答案 0 :(得分:1)

请注意,尽管使用了inConfig,但仍在javaOptions in Test配置中设置Test。如果您删除in Test,它将按预期工作:

...
  .settings(inConfig(Dev)(javaOptions += "-Dfoo=bar"))
  .settings(inConfig(Staging)(javaOptions += "-Dfoo=qux"))

(也不需要Seq(...)换行)

现在sbt:

> show Test/javaOptions
[info] *

> show Dev/javaOptions
[info] * -Dfoo=bar

> show Staging/javaOptions
[info] * -Dfoo=qux

通过显式确定每个设置的范围(不进行inConfig包装),您可以达到相同的结果:

  .settings(
    Dev/javaOptions += "-Dfoo=bar",
    Staging/javaOptions += "-Dfoo=qux",
    ...
  )

(此处Conf/javaOptionsjavaOptions in Conf相同)