2014-08-27 53 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

相關問題