Совместное использование конфигурации между двумя приложениями Grails, которые используют общий плагин
У нас будет два приложения, которые должны использовать одни и те же сервисы / утилиты / код / конфигурацию.
Мы используем grailsApplication.config.* Для настройки таких вещей, как URL-адреса внешних служб. Они различаются в зависимости от того, запущено ли приложение в dev/test/qa/staging/prod, поэтому мы использовали раздел сред в Config.groovy. Нам понадобятся одинаковые URL / среды, настроенные для обоих приложений.
Чтобы избежать дублирования, мы пытаемся создать плагин, который будет содержать все общие материалы. Это работает для сервисов и тому подобного, но плагины Grails не включают в себя Config.groovy, resources.groovy, поэтому всю конфигурацию URL и так далее нельзя поместить в Config.groovy в плагине.
Есть ли хороший способ разместить эту конфигурацию в одном месте и сделать ее доступной для обоих приложений?
Возможно, мы могли бы поместить его в какое-нибудь место в плагине и "импортировать" в Config.groovy обоих приложений?
2 ответа
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
или URL)
grails.config.locations = [com.example.CommonConfiguration,
"file:app-config.groovy"]
и поместите туда конфигурацию приложения (поскольку более поздние внешние переопределяют более ранние).
Учитывая, что вы хотите встроить конфигурацию в плагин, вам нужно будет сделать свой плагин достаточно умным, чтобы прочитать его собственную конфигурацию и объединить ее с конфигурацией содержащихся приложений. Нижеследующее основано на 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
}
Это в двух словах. Надеюсь это поможет.
Также обратите внимание, что вы все равно можете переопределить значения в вашем содержащем приложении из-за способа слияния. Конфигурация приложения объединяется с конфигурацией плагина. Если содержащее приложение определяет что-то, оно переопределит значение плагинов.