我目前正在从Maven迁移到SBT,我正在努力了解如何处理多个构建目标(dev,test,train,prod等)。
例如,我有persistence.xml
,如下所示:
<properties>
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="javax.persistence.jdbc.url" value="${db.connectionURL}"/>
<property name="javax.persistence.jdbc.user" value="${db.username}"/>
<property name="javax.persistence.jdbc.password" value="${db.password}"/>
<property name="eclipselink.target-database" value="Oracle10"/>
</properties>
使用Maven,使用配置文件处理它非常容易。
我已经尝试过这里为SBT提出的建议,但我对这种方法没有任何成功。 How to Add Environment Profile Config to SBT
此外,使用这种方法我需要为每个新环境创建一个新目录。我只是认为必须有更好的方法来使用SBT处理这种设置?
答案 0 :(得分:2)
tl; dr 使用ivyConfigurations
添加自定义配置和resourceGenerators
来处理每个环境的文件。
对Eugene Yokota的答案,所有积分都会转到How to Add Environment Profile Config to SBT。有一些修改使我的解决方案... 咳嗽 ... 咳嗽 ......稍好一点。
以下build.sbt
定义了两种新配置 - dev 和 qa 。它还为每个配置定义resourceGenerators
,有效地提供了一种方法来访问新的resourceGenerator在其中执行的配置:
val Dev = config("dev") extend Runtime
val Qa = config("qa") extend Runtime
ivyConfigurations ++= Seq(Dev, Qa)
// http://www.scala-sbt.org/0.13.5/docs/Howto/generatefiles.html#resources
lazy val bareResourceGenerators: Seq[Setting[_]] = Seq(
resourceGenerators += Def.task {
val file = resourceManaged.value / "demo" / "myapp.properties"
println(s"Inside ${configuration.value}")
val contents = s"config=${configuration.value}"
IO.write(file, contents)
Seq(file)
}.taskValue
)
inConfig(Dev)(Defaults.configSettings ++ bareResourceGenerators)
inConfig(Qa)(Defaults.configSettings ++ bareResourceGenerators)
在新的resourceGenerator中,您可以执行任何操作,并使用configuration
设置进行每配置处理,该设置为您提供配置的名称:
> show dev:configuration
[info] dev
> show qa:configuration
[info] qa
现在,当您执行show qa:resources
时,您会发现target/scala-2.10/resource_managed/qa/demo/myapp.properties
生成了两个文件,其中包含特定于配置的内容:
> show qa:resources
Inside qa
[info] List(/Users/jacek/sandbox/envs/target/scala-2.10/resource_managed/qa/demo/myapp.properties, /Users/jacek/sandbox/envs/src/qa/resources)
现在的诀窍是使用resourceGenerator来满足您的需求,因为您在Scala代码中可以做任何您想做的事情 - 只需使用configuration.value
作为配置特定代码的限定符。 / p>
说,您想在标准qa
目录中使用特定于src/main/resources
的属性文件。只需知道值绑定的位置(值的配置和设置)。它只是compile:resourceDirectory
。
> show compile:resourceDirectory
[info] /Users/jacek/sandbox/envs/src/main/resources
只要您需要&#34;稳定&#34;只需使用resourceDirectory in Compile
( aka 配置已修复)值,如src/main/resources
。
val props = (resourceDirectory in Compile).value / s"${configuration.value.name}.properties"
println(s"Read files from $props")
通过以上几行,你得到:
> show qa:resources
Inside qa
Read files from /Users/jacek/sandbox/envs/src/main/resources/qa.properties
[info] List(/Users/jacek/sandbox/envs/target/scala-2.10/resource_managed/qa/demo/myapp.properties, /Users/jacek/sandbox/envs/src/qa/resources)
> show dev:resources
Inside dev
Read files from /Users/jacek/sandbox/envs/src/main/resources/dev.properties
[info] List(/Users/jacek/sandbox/envs/target/scala-2.10/resource_managed/dev/demo/myapp.properties, /Users/jacek/sandbox/envs/src/dev/resources)