2014-01-24 60 views
0

我們將有兩個應用程序都需要使用相同的服務/實用程序/代碼/配置。在兩個共享公共插件的grails應用程序之間共享配置

我們使用grailsApplication.config。*來配置外部服務的URL。根據應用程序是否在dev/test/qa/staging/prod中運行,這些不同,因此我們使用了Config.groovy中的environments部分。我們需要爲兩個應用程序配置相同的URL /環境。

爲了避免重複,我們正在嘗試構建一個可以容納所有共享內容的插件。這適用於服務等,但Grails插件不包括Config.groovy,resources.groovy,所以所有的URL配置等都不能放在插件的Config.groovy中。

有沒有一種很好的方式將該配置放在一個地方,並有兩個應用程序可用?

也許我們可以把它放在插件的某個地方,並將它「導入」到兩個應用程序的Config.groovy中?

+0

你想配置住插件嗎?對不起,試圖瞭解這裏的設置。 –

+0

我已經將問題重寫得更清楚了。插件中的配置會很好,所以我們可以避免在兩個應用程序中重複它。 – ttt

回答

3

grails.config.locations定義用於外部配置文件可以包括java.lang.Class對象從預編譯Groovy腳本加載配置,以及file:classpath:網址以在運行時解析的Groovy或.properties文件。所以,你應該能夠在src/groovy

{}插件/src/groovy/com/example/CommonConfiguration.groovy創建的插件配置文件

package com.example 

environments { 
    production { 
    ... 
    } 
    development { 
    ... 
    } 
} 

,然後在應用程序的Config.groovy文件包括這個類grails.config.locations

grails.config.locations = [com.example.CommonConfiguration] 

但是,這意味着,當插件的CommonConfiguration和主機應用程序的Config.groovy都爲同一屬性指定一個值,插件會贏。爲了糾正這種不平衡,你需要把第二個外部在grails.config.locations(也可以是另一個Class或URL)

grails.config.locations = [com.example.CommonConfiguration, 
          "file:app-config.groovy"] 

,並把應用程序的配置在那裏(如後面的外部覆蓋在此之前的)。

+0

請注意,grails.config.locations必須是config.groovy中的最後一行,因此外部配置可以覆蓋所有內容 –

+0

@johnSmith不,它可以在任何地方。首先解析整個'Config.groovy',然後從解析後的配置文件中提取'grails.config.locations'的值,然後依次解析每個外部函數併合併到主函數中。 –

1

鑑於您希望將配置嵌入到插件中,您需要使插件足夠智能以閱讀它自己的配置並將其合併到包含的應用程序配置中。以下是基於Grails 1.3.7。自那時以來配置持有者可能已經發生了變化(2.0做了很多房子清理),但我相信你可以把這部分弄清楚。這個例子假設你的插件裏有一個名爲grails-app/conf/MyPluginConfig.groovy的配置文件。

在您的/MyPlugin.groovy中,您將在doWithSpring閉包中添加此配置的合併。

def doWithSpring = { 
    // get the current application configuration 
    def currentConfig = org.codehaus.groovy.grails.commons.ConfigurationHolder.config 
    GroovyClassLoader classLoader = new GroovyClassLoader(getClass().classLoader) 

    // get the plugin configuration 
    def pluginConfig = new ConfigSlurper(grails.util.GrailsUtil.environment).parse(classLoader.loadClass('MyPluginConfig')) 

    // merge the configurations 
    pluginConfig.merge(currentConfig) 

    // set the application configuration to the merged configuration 
    org.codehaus.groovy.grails.commons.ConfigurationHolder.config = pluginConfig 
} 

就是這樣。希望這可以幫助。

另外,請注意,由於合併的方式,您仍然可以覆蓋包含應用程序中的值。應用程序配置合併到插件配置中。如果包含應用程序定義了某些內容,它將覆蓋插件值。

+0

同意。我們的grails應用程序主要由插件組成。每個都有自己的默認值(甚至是兩個應用程序共享的默認值)。合併默認配置和*可能由客戶端設置的配置讓我們記錄我們的默認值以及客戶端的適當標籤來覆蓋默認值。很棒。 – railsdog

+0

這與應用程序的外部配置文件相結合,使我獲得了以我的體驗獲勝的組合。 –

相關問題