#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
не был прочитан. Я опубликовал решение с использованием groovysConfigSlurper
. В любом случае спасибо.
Ответ №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