2014-01-24 59 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

这与应用程序的外部配置文件相结合,使我获得了以我的体验获胜的组合。 –

相关问题