gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:54:38 25 4
gpt4 key购买 nike

我目前正在从 Maven 迁移到 SBT,我正在努力了解如何处理多个构建目标(开发、测试、训练、生产等)。

例如,我有一个如下所示的 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 处理这种设置?

最佳答案

tl;dr 使用 ivyConfigurations 添加自定义配置,使用 resourceGenerators 处理每个环境的文件。

所有学分转到Eugene Yokota How to Add Environment Profile Config to SBT的答案.有一些修改使我的解决方案...咳嗽...咳嗽...稍微好一点。

下面的 build.sbt 定义了两个新配置 - devqa。它还为每个配置定义了 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 作为特定配置的限定符代码。

例如,您想在标准 src/main/resources 目录中使用特定于 qa 的属性文件。只知道值绑定(bind)到哪里(值来自什么配置和设置)。它只是 compile:resourceDirectory

> show compile:resourceDirectory
[info] /Users/jacek/sandbox/envs/src/main/resources

只要您需要一个“稳定的”(又名配置固定)值,如src/main/resources,只需在编译中使用resourceDirectory

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)

关于maven - 如何处理多个构建目标,例如开发、测试、主要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26217862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com