Совместное использование конфигурации между двумя приложениями 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
}

Это в двух словах. Надеюсь это поможет.

Также обратите внимание, что вы все равно можете переопределить значения в вашем содержащем приложении из-за способа слияния. Конфигурация приложения объединяется с конфигурацией плагина. Если содержащее приложение определяет что-то, оно переопределит значение плагинов.

Другие вопросы по тегам