使用Buildr和Ivy的例子?

时间:2012-04-20 21:05:09

标签: ivy buildr

我们正在考虑将我们的构建系统从Ant + Ivy迁移到其他东西,而Buildr是其中一种可能性。但是,它似乎不支持开箱即用的Ivy,我们也不希望将我们的内部常春藤repo和ivy.xml文件转换为Maven和POM。

我看到有一个带有Buildr扩展的ivy4r项目,似乎是整合这两者的唯一方法。但是,该项目在相当长的一段时间内没有新的开发,并且没有可靠的示例或文档。

有没有人有Buildr + Ivy集成的样本或ivy4r的简单示例?我不是Ruby开发人员,因此语法对我来说很陌生,如果没有一些示例代码,我担心这样做会非常困难。

1 个答案:

答案 0 :(得分:0)

以下是一个小型构建文件,其中显示buildrivy4r。评论应该清楚说明会发生什么。

最重要的是要记住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