Может ли buildr включить результат пакета подпроекта в ресурсы текущего проекта?

Если я хочу упаковать файл jar подпроекта в основной файл jar, я могу сделать следующее:

define 'library' do
  project.version = '0.1'

  define 'subproject' do
    package :jar
  end

  package(:jar).include(project('subproject').package(:jar),
                        as: 'org/acme/library/subproject.jar')
end

Это лениво создаст банку в подпроекте, прямо перед тем, как она понадобится для упаковки в основную банку, и все работает.

Проблема в том, что мои тесты также хотят использовать jar-файл, поэтому логическое место для него - ресурсы. Поэтому мне интересно, как я должен скопировать что-то, созданное другим проектом, в ресурсы этого проекта. В документах, в частности, отсутствуют какие-либо примеры этого, и в основном они сосредоточены на том, как скопировать один каталог файлов в другой.

Вот что я попробовал:

 resources.from(project('subproject').package(:jar),
                as: 'org/acme/library/subproject.jar')

Это не удается:

RuntimeError : Source directory $HOME/Documents/library/subproject/target/library-subproject-0.1.jar doesn't exist
$HOME/Documents/library/buildfile:38:in `block in <top (required)>'

К моему удивлению, это, кажется, единственное место в buildr, которое охотно оценивает существование продукта сборки вместо того, чтобы устанавливать его как ленивую зависимость...

Я могу обойти это следующим образом:

# Crappy workaround to eagerly create target dir in subproject.
mkdir_p project("lucene#{ver}").path_to(:target)

resources.from(project("lucene#{ver}").path_to(:target)).
                 include(project("lucene#{ver}").package(:jar))

Мне это не нравится, потому что он по-прежнему охотно оценивает каталог, что вынуждает меня создать этот каталог задолго до запуска какой-либо сборки. Это означает, что даже когда я бегу buildr cleanсоздает этот каталог. Тьфу.

Так каков правильный способ сделать это?

1 ответ

Обычно мы делаем так, чтобы не создавать пакеты с проектом верхнего уровня, а вместо этого использовать подпроект для определения двух пакетов. т.е.

define 'myproject'
  ...
  define 'model' do
    ...
    package(:jar)
  end

  define 'server' do
    ...
    package(:war) do |war|
      war.libs.clear
      war.libs << project('model').package(:jar)
    end
  end
end

Это позволяет значительно упростить управление зависимостями и упорядочение сборок. Надеюсь, это поможет!

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