Пример использования Buildr с Ivy?
Мы смотрим на миграцию нашей системы сборки с Ant+Ivy на что-то другое, и Buildr - одна из возможностей. Однако он не поддерживает Ivy "из коробки", и у нас нет желания конвертировать наши собственные репозитории Ivy и файлы ivy.xml в Maven и POM.
Я вижу, что есть проект ivy4r с расширением Buildr, который, кажется, является единственным способом их интеграции. Тем не менее, проект не имел новой разработки в течение достаточно долгого времени, и нет никаких убедительных примеров или документации.
У кого-нибудь есть пример интеграции Buildr + Ivy или простой пример ivy4r? Я не разработчик Ruby, поэтому синтаксис для меня чужд, и без некоторого примера кода я боюсь, что это будет очень трудно сделать эту работу.
1 ответ
Ниже приведен небольшой сборочный файл, который показывает buildr
вместе с ivy4r
, Комментарии должны прояснить, что происходит.
Самое важное, что нужно помнить, это то, что post_resolve
блоки выполняются только тогда, когда сборка уже запущена. Если вы установили зависимости задач, которые приводят к разрешению плюща в них, будет слишком поздно.
require 'buildr/ivy_extension'
repositories.remote << "http://repo1.maven.org/maven2"
THIS_VERSION = 1.0
define 'my-app', :version => THIS_VERSION do
# Tell ivy4r to add task dependencies to the compile and test tasks.
# These tasks will cause ivy to resolve the needed artefacts.
ivy.compile :conf => 'default', :type => 'jar'
ivy.test :conf => 'test', :type => 'jar'
# Declare package tasks so that buildr sets up their dependencies.
jar = package :jar
zip = package :zip
# During the build, at some point ivy will resolve because of the
# task dependencies set up above.
# After ivy has resolved, the post_resolve blocks will be run.
ivy.post_resolve do |ivy|
# Now that ivy has resolved, get a list of the jar artefacts.
deps = ivy.deps :conf => 'default', :type => 'jar'
# Do something interesting with the artefacts.
# -> e.g. put them in the manifest of the main jar
jar.with :manifest => manifest.merge({
'Main-Class' => 'Main',
'Class-Path' => deps.map { |f| "#{File.basename(f)}" }.join(', '),
})
# -> package the app as a zip, including also those artefacts
# This results in a main.jar that specifies its own class path
# and can be run by double-clicking or just java -jar main.jar
zip.path("#{id}-#{version}").tap do |p|
p.include jar, :as => 'main.jar'
p.include deps
end
end
end