Каков наилучший способ изменить конфигурацию проекта из плагина? - PullRequest
5 голосов
/ 16 марта 2012

Когда я пытаюсь написать плагин Grails, я наткнулся на две проблемы:

  • как мне изменить один из файлов конфигурации, например Config.groovy или DataSource.groovy, из _install.groovy скрипт?К этим файлам легко что-то добавить, но как мне изменить это чисто?text.replaceAll()?Или я должен создать новый файл конфигурации?
  • как мне получить имя текущего приложения, в которое будет установлен плагин?Я пытался использовать app.name и appName, но оба не работают.

Может быть, есть где-нибудь хорошее руководство по созданию плагинов, которое я еще не нашел?

Ответы [ 3 ]

5 голосов
/ 20 марта 2012

Вот пример редактирования файлов конфигурации из scripts/_Install.groovy.
Мой плагин копирует три файла в целевой каталог.

  • .hgignore используется для контроля версии,
  • DataSource.groovy заменяет версию по умолчанию, а
  • SecurityConfig.groovy содержит дополнительные настройки.

Я предпочитаю как можно меньше редактировать файлы приложения, особенно потому, что я ожидаю изменить настройки безопасности через несколько лет.Мне также нужно использовать свойства из файла jcc-server-config.properties, который настраивается для каждого сервера приложений в нашей системе.

Копировать файлы очень просто.

println ('* copying .hgignore ')
ant.copy(file: "${pluginBasedir}/src/samples/.hgignore",
         todir: "${basedir}")
println ('* copying SecurityConfig.groovy')
ant.copy(file: "${pluginBasedir}/src/samples/SecurityConfig.groovy",
         todir: "${basedir}/grails-app/conf")
println ('* copying DataSource.groovy')
ant.copy(file: "${pluginBasedir}/src/samples/DataSource.groovy",
         todir: "${basedir}/grails-app/conf")

Сложная задача - получить Grailsподобрать новый файл конфигурации.Для этого мне нужно отредактировать приложение grails-app/conf/Config.groovy.Я добавлю два файла конфигурации, которые можно найти в classpath.

println ('* Adding configuration files to grails.config.locations');
// Add configuration files to grails.config.locations.
def newConfigFiles = ["classpath:jcc-server-config.properties", 
                      "classpath:SecurityConfig.groovy"]
// Get the application's Config.groovy file
def cfg = new File("${basedir}/grails-app/conf/Config.groovy");
def cfgText = cfg.text
def appendedText = new StringWriter()
appendedText.println ""
appendedText.println ("// Added by edu-sunyjcc-addons plugin");
// Slurp the configuration so we can look at grails.config.locations.
def config = new ConfigSlurper().parse(cfg.toURL());
// If it isn't defined, create it as a list.
if (config.grails.config.locations.getClass() == groovy.util.ConfigObject) {
    appendedText.println('grails.config.locations = []');
} else {
    // Don't add configuration files that are already on the list.
    newConfigFiles = newConfigFiles.grep {
      !config.grails.config.locations.contains(it)
    };
}
// Add each surviving location to the list.
newConfigFiles.each {
    // The name will have quotes around it...
    appendedText.println "grails.config.locations << \"$it\"";
}
// Write the new configuration code to the end of Config.groovy.
cfg.append(appendedText.toString());

Единственная проблема - добавление SecurityConfig.groovy в classpath.Я обнаружил, что вы можете сделать это, создав следующее событие в плагине /scripts/Events.groovy.

eventCompileEnd = {
    ant.copy(todir:classesDirPath) {
      fileset(file:"${basedir}/grails-app/conf/SecurityConfig.groovy")
    }
}

Ред.

3 голосов
/ 16 марта 2012

Вы можете попробовать изменить конфигурацию в файле MyNiftyPlugin.groovy (при условии, что ваш плагин называется my-nifty). Я обнаружил, что могу изменить значения конфигурации в закрытии doWithApplicationContext. Вот пример.

def doWithApplicationContext = { applicationContext ->  
  def config = application.config;
  config.edu.mycollege.server.name = 'http://localhost:8080'
  config.edu.mycollege.server.instance = 'pprd'
}

Введенные здесь значения отображаются в переменной grailsApplication.config во время выполнения. Если это работает для вас, это будет более подходящее решение, потому что оно не требует изменений в клиентском проекте.

Я должен отнести это к тому факту, что я не смог заставить Spring Security работать с помощью этой техники. Я считаю, что мой плагин (который зависит от Spring Security) был загружен после инициализации безопасности. Я решил добавить дополнительный файл в каталог grails-app / conf.

НТН.

1 голос
/ 16 марта 2012

Для изменения файлов конфигурации вы должны использовать ConfigSlurper :

def configParser = new ConfigSlurper(grailsSettings.grailsEnv)
configParser.binding = [userHome: userHome]
def config = configParser.parse(new URL("file:./grails-app/conf/Config.groovy"))

Если вам нужно получить имя приложения из скрипта, попробуйте:

metadata.'app.name'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...