在共享一个公共插件的两个grails应用程序之间共享配置

时间:2014-01-24 21:16:04

标签: grails config grails-plugin

我们将有两个应用程序都需要使用相同的服务/实用程序/代码/配置。

我们正在使用grailsApplication.config。*来配置外部服务的URL等内容。这些是不同的取决于应用程序是否在dev / test / qa / staging / prod中运行,因此我们使用了Config.groovy中的环境部分。我们需要为这两个应用程序配置相同的URL /环境。

为了避免重复,我们正在尝试构建一个包含所有共享内容的插件。这适用于服务等,但Grails插件不包括Config.groovy,resources.groovy所以所有URL配置等都不能放在插件中的Config.groovy中。

是否有一种很好的方法可以将该配置放在一个位置并让它可用于这两个应用程序?

也许我们可以将它放在插件中的某个位置并将其“导入”到两个应用的Config.groovy中?

2 个答案:

答案 0 :(得分:3)

外部配置文件的grails.config.locations定义可包括java.lang.Class个对象,用于从预编译的Groovy脚本加载配置,以及file:classpath: URL来解析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或网址)中添加第二个外部广告

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

并将app配置放在那里(因为后面的外部覆盖了之前的那些)。

答案 1 :(得分: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
}

简而言之就是这样。希望这可以帮助。

另外,请注意,由于合并的方式,您仍然可以覆盖包含应用程序中的值。应用程序配置合并到插件配置中。如果包含的应用程序定义了某些内容,它将覆盖插件值。