Настройки доступа в BuildConfig

#grails #build #config

#grails #сборка #конфигурация

Вопрос:

Возможно ли каким-либо образом получить доступ к свойствам, указанным в Config.groovy внутри BuildConfig.groovy ?

Мне нужно скопировать некоторые файлы начальной загрузки в процессе упаковки, и целевой каталог зависит от указанной среды. Поскольку мне нужно получить доступ к этим файлам во время начальной загрузки приложения, я хотел бы определить путь в Config.groovy и, скорее, не дублировать его.

Ответ №1:

Если, когда вы говорите о процессе упаковки, вы имеете в виду процесс генерации файла WAR, то я смог скопировать файлы в разные места, используя скрипты / события Grails. Например, мне нужно было скопировать один файл в папку WEB-INF/classes при создании WAR, поэтому я создал файл Events.groovy в папке /scripts со следующим содержимым:

 // Copy liquibase changelog.xml to classpath folder
eventWarStart = {warName ->
  if (grailsEnv == "production") {
    println "Copying database migration files to classpath!"
    Ant.copy(toFile: "${classesDirPath}/changelog.xml", filtering: true, overwrite: true) {
      fileset(file: "${basedir}/grails-app/migrations/changelog.xml")
    }
    Ant.copy(toDir: "${classesDirPath}/releases/", filtering: true, overwrite: true) {
      fileset(dir: "${basedir}/grails-app/migrations/releases/")
    }
  }
}
  

Как вы можете видеть в событии, вы можете получить доступ к среде.

Если это не то, что вы имели в виду, то просто проигнорируйте мой ответ.

Комментарии:

1. 1 за то, что все сделал правильно и не взламывал систему сборки.

2. Спасибо. Я использую grails.war.resources опцию для копирования файлов до упаковки WAR. Проблема остается прежней при вашем подходе, я полагаю: мне каким-то образом нужно получить доступ к опции в Events.groovy скрипте, который определен в Config.groovy . Поправьте меня, если я ошибаюсь. @Rob Elsner: Что именно означает «обходной путь» в моем подходе? Я использую ConfigSlurper , чтобы получить доступ к своим конфигурациям, чтобы я мог использовать их в grails.war.resources закрытии. Пожалуйста, объясните свое заявление.

Ответ №2:

Обычным способом доступа к свойству, bootstrap.path определенному в Config.groovy , является

 def bootStrapPath = org.codehaus.groovy.grails.commons.ConfigurationHolder.config.bootstrap.path 
  

Я не пробовал это из BuildConfig.groovy , но если это не сработает, то, я думаю, это потому, что Config.groovy не было прочитано при BuildConfig.groovy выполнении. В этом случае вам нужно будет прочитать это самостоятельно. Реализация ConfigurationHolder должна показать вам, как это сделать.

Комментарии:

1. Как вы упомянули, Config.groovy не был прочитан. Я опубликовал решение с использованием groovys ConfigSlurper . В любом случае спасибо.

Ответ №3:

Вы можете сделать это:

 System.getProperty('grails.env')
  

для получения текущей среды.

Комментарии:

1. Спасибо, но дело не в среде (это вы также можете получить с помощью grailsSettings.grailsEnv ). Мне интересно, как я могу получить доступ к свойству, которое я определил в своем Config.groovy (например bootstrap.path=resources/bootstrap ) внутри BuildConfig.groovy .

Ответ №4:

Единственным решением, которое я нашел, было чтение Config.groovy самостоятельно (как упоминал Дон). Вот мое двухстрочное решение:

 def directory = new File(getClass().protectionDomain.codeSource.location.path).parent
def config = new ConfigSlurper(grailsSettings.grailsEnv).parse(new File(directory   File.separator   "Config.groovy").toURI().toURL())

println config.bootstrapPath