我们将有两个应用程序都需要使用相同的服务/实用程序/代码/配置。
我们正在使用GrailSapplication.config。*将URL之类的内容配置为外部服务。这些不同,具体取决于该应用程序是否在DEV/TEST/QA/staging/prod中运行,因此我们使用了config.groovy中的环境部分。我们需要为两个应用程序配置的相同URL/环境。
为了避免重复,我们正在尝试构建一个可以容纳所有共享内容的插件。这适用于服务等等,但是Grails插件不包括config.groovy,resources.groovy,因此所有URL配置以及该插件都不能放入config.groovy中。
是否有一种很好的方法可以将该配置放在一个地方,并且是否适用于两个应用程序?
也许我们可以将其放在插件中的某个位置,然后将其"导入"两个应用程序的config.groovy?
外部配置文件的grails.config.locations
定义可以包括java.lang.Class
对象,以加载从预编译的Groovy脚本以及file:
或classpath:
URL中加载配置,以在运行时解析Groovy或.properties
文件。因此,您应该能够在src/groovy
{plugin}/src/groovy/com/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"]
并将应用程序配置放入其中(随着后期外部替代较早的外观)。
给定您要嵌入插件中的配置,您需要使插件足够聪明以读取其自己的配置并将其合并到包含的应用程序配置中。以下基于圣杯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
}
简而言之。希望这可以帮助。
另外,请注意,由于合并的方式,您仍然可以覆盖包含应用程序中的值。应用程序配置合并到插件配置中。如果包含应用程序定义了某些内容,则它将覆盖插件值。