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