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

Scala 多个SBT配置应该是独占的,但它们都同时激活-为什么?,scala,sbt,Scala,Sbt,我定义了一个最小build.sbt,其中包含两个自定义配置文件“dev”和“staging”(sbt似乎称之为配置)。但是,当我使用文件(dev)中首先定义的配置运行SBT时,两个配置块都会执行——如果两个配置块都修改了相同的设置,则最后一个配置块将获胜(staging) 这似乎打破了任何条件激活的概念,那么我在SBT上做错了什么 作为参考,我想模拟Maven的条件激活配置文件概念,例如mvn测试-p staging SBT版本:1.2.1 build.sbt: name := "example

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

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

作为参考,我想模拟Maven的条件激活配置文件概念,例如
mvn测试-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

请注意,尽管在图中使用了
,但您仍然在Test
中设置了
javaOptions,即在
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
wrapping)来实现相同的结果:


(这里的
Conf/javaOptions
与Conf中的
javaOptions
相同)

你看到了吗?@pedrorijo91我看到了这篇文章,虽然资源筛选看起来很有趣,但它仍然使用了与我的示例相同的SBT配置概念,所以我不知道它们是如何做到只应用一个环境的。我在这里遗漏了什么……试一试,确信正确的Java系统属性在SBT的每个环境中都会显示出来。然而,奇怪的是,当我在测试代码中打印System.getProperties时,出现了与环境无关的javaOptions,但缺少了与环境相关的javaOptions。现在这很奇怪。我忘记添加样板文件
.settings(inConfig(Dev)(Defaults.testSettings))
.settings(inConfig(Staging)(Defaults.testSettings))
。一旦我添加了这些,并进行了更改,测试就运行起来,看到了正确的javaOptions。我很高兴您找到了原因。
  .settings(
    Dev/javaOptions += "-Dfoo=bar",
    Staging/javaOptions += "-Dfoo=qux",
    ...
  )