2014-08-27 52 views
6

我想在我的grails应用程序中加载环境特定的配置,以便根据运行grails应用程序的哪个JVM,我可以指向特定于环境的url。在我的情况下,当我的应用从dev到prod时,我有4个不同的环境可以使用(而不是grails应用假设的默认3)。如何告诉Grails应用程序在哪个环境中?

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

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

谢谢。

+2

所有你需要的是在这里:http://grails.org/doc/latest/guide/conf.html#environments :) – 2014-08-27 17:49:48

+0

谢谢。我读过。我很难理解Grails如何知道/告知 - 除了它目前在哪个环境?当应用程序从开发移动到,例如prod,它是如何知道它是刺激? – Stealth 2014-08-27 17:51:44

+0

这取决于。如果您使用'run-app'运行grails应用程序,则可以将环境名称与'run-app'命令一起传递。如果你在Tomcat中部署它,你将创建一个特定于环境的战争,并且你可以在建立战争的时候选择环境('grails war'')。在“为不同环境打包并运行”部分的链接文档页面中,这些描述都非常好。 – 2014-08-27 17:57:29

回答

13

设置变量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) 
    } 

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

if (grails.util.Environment.current == grails.util.Environment.DEVELOPMENT) { 
+0

我得到了。但是,我无法找到“在运行期间检查和加载环境特定配置的最佳位置?”的答案。 – Stealth 2014-08-27 18:20:09

+0

基于您设置的环境,Grails使用环境DSL中设置的值,如DataSource.groovy中所设置的值。否则,您可以像上例那样从grails.util.Environment.current.name中获取名称。 – Joe 2014-08-27 18:30:31

1

如果你有告诉你,你在你什么样的环境可以简单地添加if语句或在您的Config.groovy文件switch语句,像这样提供一个系统属性:

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

该解决方案也可以在其他配置文件中使用grails-app/conf

使用groovy ConfigSlurper解析Grails配置文件,以便您可以将可执行代码放在那里而不会出现问题。

4

没有设置JVM启动参数:

-Dgrails.env=whatever 

你的Grails应用程序将使用

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

设置的值会有这样设置的值:

grails.env=development 

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

-Dgrails.env=development war 

打造战争那么application.properties将有grails.env =发展,如果你离开这个关,则默认为Grails的。env =生产

就您的问题而言,您并不具体说明正在配置使用“环境特定的URL”的内容。目前还不清楚你如何存储这些环境特定的URL。如果,例如,URL变量是一个Grails服务的成员变量和你存储环境的具体网址在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" 

希望有帮助。

0

对不起,这太晚了,但另一种方法是在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

相关问题