【问题标题】:How to tell Grails application which environment it is in?如何告诉 Grails 应用程序它在哪个环境中?
【发布时间】:2014-08-27 17:45:13
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • 您所需要的都在这里:grails.org/doc/latest/guide/conf.html#environments :)
  • 谢谢。我读了那个。我无法理解 grails 如何知道/区分它当前所处的环境?当应用程序从 dev 转移到 prod 时,它如何知道它是 prod?
  • 视情况而定。如果您使用run-app 运行grails 应用程序,那么您可以将环境名称与run-app 命令一起传递。例如,如果您在 Tomcat 中部署它,您将创建特定于环境的战争,并且您可以在构建战争时选择环境 (grails <env_name> war)。这一切都在“针对不同环境的打包和运行”部分的链接文档页面中进行了很好的描述。
  • 谢谢帕维尔。我真的很感谢你的帮助。在我工作的环境中,我使用 maven 和一些构建脚本从 dev...prod 移动代码。在打包战争时,我们从不告诉应用程序 ,因为我们尝试以不可知论的方式对应用程序环境进行编程。这就是为什么,当 grails-app 启动并加载配置时,我需要动态检查环境。
  • 如果您不想为每个 JVM 构建单独的 WAR 文件,您可以添加代码来检查 System 属性的值并根据该值设置配置。

标签: grails grails-2.0 grails-config


【解决方案1】:

将变量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) {

【讨论】:

  • 这个我明白了。但是我很难找到“在运行时检查和加载特定于环境的配置的最佳位置是什么?”的答案?
  • Grails 根据您设置的环境使用环境 DSL 中设置的值,例如 DataSource.groovy。否则,您可以像上面的示例一样从 grails.util.Environment.current.name 获取名称。
【解决方案2】:

不设置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 变量是 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"

希望对您有所帮助。

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

      抱歉,来晚了,但另一种方法是在 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

      【讨论】:

        【解决方案5】:

        作为其他答案的附录:

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

        【讨论】:

          猜你喜欢
          • 2018-10-26
          • 1970-01-01
          • 2012-10-09
          • 1970-01-01
          • 2011-11-21
          • 1970-01-01
          • 1970-01-01
          • 2011-04-10
          • 1970-01-01
          相关资源
          最近更新 更多