如何使用先决条件声明Rake :: PackageTask?

时间:2013-12-12 19:20:02

标签: ruby rake buildr

在Rake中,我可以使用以下语法声明任务charlie要求先完成任务alphabravo

task :charlie => [:alpha, :bravo]

如果charlie是典型的Rake任务或文件任务,这似乎工作正常,但我无法弄清楚如何为Rake::PackageTask执行此操作。以下是rakefile的相关部分:

require 'rake/packagetask'

file :package_jar => [:compile] do
   puts("Packaging library.jar...")
   # code omitted for brevity, but this bit works fine
end

Rake::PackageTask.new("library", "1.0") do |pt|
   puts("Packaging library distribution artefact...")
   pt.need_tar = true
   pt.package_files = ["target/library.jar"]
end
task :package => :package_jar

这里发生的事情是,对于干净的构建,它抱怨它“不知道如何构建任务'target / library.jar'”。我必须手动从命令行运行rake package_jar才能使它工作,这有点令人讨厌。 我有什么方法可以让package取决于package_jar

对于它的价值,我在Linux上使用Rake版本0.9.2.2和Ruby 1.8.7。

3 个答案:

答案 0 :(得分:1)

当您运行rake package(之前没有运行任何其他内容来创建任何所需文件)时,Rake发现包任务需要文件target/library.jar。由于此文件尚不存在,因此Rake会检查它是否知道如何创建它。它不知道会创建此文件的任何规则,因此它会因您看到的错误而失败。

Rake 有一个它认为会创建一个名为package_jar的文件的任务,而该任务实际上会创建文件target/library.jar,但它没有意识到这一点

修复是告诉Rake确切地在file任务中创建了哪个文件。然后Rake会自动找到依赖项。

更改

file :package_jar => [:compile] do

file 'target/library.jar' => [:compile] do

然后删除该行

task :package => :package_jar

因为package_jar不再存在,Rake会自己找到对文件的依赖。

答案 1 :(得分:0)

通常在rake中,如果要向任务添加依赖项,则需要该任务的名称。因此,您需要确定Rake::PackageTask正在注册的实际rake任务的名称。

最简单的方法是使用--trace运行 - 它会在执行时列出每个任务的名称。

(我相信buildr包的名称是它生成的包的文件名,但我不记得。请使用--trace查找。)

答案 2 :(得分:0)

您可以通过编写

为任何任务添加依赖项
someTask.enhance [other, tasks]

其中othertasks可以是任务名称或任务对象。

所以在你的情况下,你可以写:

library = Rake::PackageTask.new(...) do
  ...
end

task(:package).enhance([library])