Как условно включить один из двух файлов в пакет .war с Buildr? - PullRequest
1 голос
/ 15 декабря 2010

Мы используем Buildr для упаковки приложения в файл .war .Чтобы еще больше упростить процесс автоматического развертывания, я бы хотел условно выбрать один из этих двух файлов (из каталога src/main/resources) ...

  • database-hsql.properties
  • database-postgres.properties

... и включить его в получившийся .war с именем database.properties.(В том же месте внутри WAR, а именно WEB-INF/classes/, где теперь находятся файлы из src/main/resources.)

Есть ли простой способ сделать это?Подойдет любой подход - например, параметризация «пакета» (как-то) или определение двух разных задач / целей (я не уверен в терминологии), таких как «пакет-hsql» и «пакет-pgsql», - до тех пор, пока это работаети достаточно прост.

Соответствующие биты buildfile:

load 'dependencies' 
require 'buildr/hibernate'

desc "..."
define "foo" do

  project.version = VERSION_NUMBER
  project.group = GROUP
  manifest["Implementation-Vendor"] = COPYRIGHT
  compile.with WICKET,GUAVA,GSON, ... [many more libs]
  test.with MOCKITO
  resources

  test.compile.with SERVLET,_('src/main/webapp'),_('src/main/resources')
  package(:war).with(:libs=> [WICKET,GUAVA,GSON, ... ])

end

Бонусный вопрос : как выполнить произвольную команду оболочки (я бы использовал что-то, включающеенапример, >> или sed) в каждом из двух случаев внести изменения в другой файл конфигурации?(Я также хотел бы «вставить» некоторые настройки БД в applicationContext.xml из другого файла; это было бы предпочтительнее, чем хранить две копии этого файла в VCS с почти одинаковым содержимым.)

Извините, если этослишком простой;Я новичок в Buildr и не знаю Руби.(И да, использование инструмента, которым не владеет ни один из членов команды, не является оптимальной ситуацией ...) Если что-то требует уточнения, укажите это!

1 Ответ

2 голосов
/ 16 декабря 2010

Обычный способ параметризации сборки buildr - использование переменных среды. Например, вы можете спроектировать сборку так:

$ buildr package DATABASE=postgres

В вашем файле сборки вы можете иметь:

ENV['DATABASE'] ||= 'hsql' # this line makes the default 'hsql'

define "foo" do
  # the rest of the definition

  resources.enhance do
    cp _(:source, :main, :resources, "database-#{ENV['DATABASE']}.properties"), _(:target, :resources, "database.properties")
  end
end

Это самое простое решение; Единственным недостатком, который вы можете считать, является то, что он скопирует два файла database-*.properties в дополнение к файлу database.properties, который вы фактически будете использовать. Если это проблема, то это можно обойти за счет некоторой сложности.

Бонусный ответ : Вы можете выполнить произвольную команду оболочки, используя system. Например, ценой субскорости я мог бы реализовать вышеизложенное как:

resources.enhance do
  system("cp '#{_(:source, :main, :resources, "database-#{ENV['DATABASE']}.properties")}' '#{_(:target, :resources, "database.properties")}'")
end

Если вы хотите внедрить свойства в файл конфигурации, вы можете посмотреть механизм фильтра в Buildr.

...