如何处理多个构建目标,例如开发,测试,主要?

时间:2014-10-06 13:55:39

标签: maven sbt

我目前正在从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处理这种设置?

1 个答案:

答案 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)