我用两个自定义配置文件“ 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
答案 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/javaOptions
与javaOptions in Conf
相同)