11

我想在我的 grails 应用程序中加载特定于环境的配置,以便根据 grails 应用程序在哪个 JVM 上运行,我可以指向该环境特定的 url。就我而言,当我的应用程序从 dev 变为 prod 时,我有 4 个不同的环境可供使用(而不是 grails 应用程序假定的默认 3 个环境)。

我的 JVM 都定义了一个系统属性,当我执行“System.getProperty()”时,告诉我该应用程序正在哪个环境中运行。

我的问题是,在运行时检查和加载特定于环境的配置的最佳位置是什么?在 BootStrap.groovy 内部?我没有使用命令行或 grails {env_name} war 构建我的战争文件的选项。

谢谢。

4

5 回答 5

22

将变量 grailsEnv 设置为 Tomcat 的环境 Java 变量下面是一个示例:

set CATALINA_OPTS=%CATALINA_OPTS% -Xms256m -Xmx1024m -Dgrails.env=development

在 grails 命令行上添加环境变量:

grails run-app -Dgrails.env=stage

您可以像这样使用检查环境变量:

    if (grails.util.Environment.current.name == "development") {
        UsageCodeDefinition ucd = new UsageCodeDefinition()
        ucd.setDescription("UFARSFileUpload Upload Development")
        ucd.setFiscalYear("12-13")
        ucd.setInstructions("Welcome to UFARSFileUpload Development were Open")
        ucd.save(failOnError: true)
    }

您可以使用枚举值而不是名称变量,但如果您使用自定义环境值,则它们将映射到枚举自定义并使用名称来区分自定义值。

   if (grails.util.Environment.current == grails.util.Environment.DEVELOPMENT) {
于 2014-08-27T18:16:01.007 回答
10

不设置JVM启动参数:

-Dgrails.env=whatever

您的 grails 应用程序将使用中设置的值

<yourapp>/WEB-INF/classes/application.properties

会有一个这样的值集:

grails.env=development

此默认环境值取决于构建战争时使用的选项。你可以用

-Dgrails.env=development war

然后 application.properties 将有 grails.env=development,如果你把它关掉,它默认为 grails.env=production

至于您的问题,您并没有具体说明配置为使用“环境特定的 url”。并且不清楚您如何存储这些环境特定的 url。例如,如果 URL 变量是 Grails 服务的成员变量,并且您将环境特定的 URL 存储在 Config.groovy 中,那么您可以

import grails.util.Environment

...
//inject the GrailsApplication Configuration in Config.groovy
def grailsApplication
//Hold the URL value from Config.groovy
String environmentUrl
...
Environment current = Environment.getCurrent()

if(Environment.PRODUCTION == current) { 
    environmentUrl = grailsApplication.config.PRODUCTION_URL
} else {
    environmentUrl = grailsApplication.config.DEVELOPMENT_URL
}

Config.groovy 在哪里

PRODUCTION_URL = "http://blah.com/blah/"
DEVELOPMENT_URL = "http://blah.dev/blah"

希望有帮助。

于 2014-08-27T21:27:22.830 回答
2

如果您有一个可用的 System 属性来告诉您所处的环境,您可以简单地在Config.groovy文件中添加 if 语句或 switch 语句,如下所示:

if (System.getProperty("foo") == "myTestEnvironment") {
    myConfigSetting = "test"
} else if (System.getProperty("foo") == "myProductionEnvironment") {
    myConfigSetting = "production"
}

此解决方案也适用于其他配置文件grails-app/conf

Grails 配置文件使用 groovy ConfigSlurper 进行解析,因此您可以毫无问题地将可执行代码放入其中。

于 2014-08-27T18:32:54.763 回答
1

抱歉,这已经晚了,但另一种方法是在 BootStrap.groovy 中注入配置属性。

例如:

if (currentEnv == Environment.DEVELOPMENT) {
    ...
    grailsApplication.config.some.property = DEVELOPMENT_ENVRIONMENT
    ...
}
else if (currentEnv == Environment.TEST) {
    ...
    grailsApplication.config.some.property = TEST_ENVIRONMENT
    ...
}

我最近用过这个,效果很好。我们正在使用 Grails 2.5.2

于 2016-06-16T15:33:56.543 回答
1

作为其他答案的附录:

您可以使用环境。isDevelopmentMode()或以更规范的方式Environment.developmentMode检查环境是否设置为开发。当您采用仅在生产设置为默认设置的代码上修改开发设置的方法时,这很有用。

于 2021-04-19T21:14:28.207 回答