buildr可以在当前项目的资源中包含子项目包的结果吗?

时间:2015-07-09 05:44:50

标签: build 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,就在它需要包装到主jar之前,一切正常。

问题是,我的测试也想使用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)>'

令我惊讶的是,这似乎是构建器中的一个地方,急切地评估构建产品的存在,而不是将其设置为懒惰的依赖...

我可以解决以下问题:

# 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 个答案:

答案 0 :(得分: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

这样可以更轻松地管理依赖项和构建顺序。希望有所帮助!