2013-12-12 80 views
1

在Rake中,我可以使用以下语法声明该任务charlie需要任务alphabravo先完成。如何使用先决条件声明Rake :: PackageTask?

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

这似乎很好地工作,如果charlie是一个典型的Rake任务或文件的任务,但我无法弄清楚如何为Rake::PackageTask做到这一点。下面是Rake文件的相关部分迄今:

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 

这里发生的事情是,对于一个干净的构建,它抱怨不“知道如何建立任务‘目标/ library.jar’” 。我必须从命令行手动运行rake package_jar才能使其正常工作,这有点麻烦。 有什么办法可以让package取决于package_jar

对于什么是值得的,我在Linux上使用Rake版本0.9.2.2和Ruby 1.8.7。

回答

1

当您运行rake package(以前没有运行任何东西,以创建任何需要的文件)耙看到该包任务所需要的文件target/library.jar。由于该文件尚不存在,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不再存在,佣金会自行找到该文件的依赖。

+0

这工作,谢谢。不过,这看起来很疯狂,你不得不在他们出品的产品之后命名你的任务,而不是他们实际做的事!我不认为有解决办法,是吗? – ATG

+0

@ATG在'file'任务的情况下,我认为在创建文件后命名它们是有意义的。你告诉Rake“这就是你创建这个文件的过程”,这意味着如果Rake需要创建文件(就像在这种情况下),它知道该怎么做。如果您希望能够以更简单的名称自行调用该任务,则始终可以添加'task:package_jar =>'target/library.jar'。 – matt

+0

我明白你的观点,但我习惯于能够给我的任务/方法等描述他们所做的事情的有意义的名字。这看起来很奇怪,因为传统的构建任务(如“编译”和“测试”)是根据执行的操作而不是操作的结果命名的。无论如何,感谢您的帮助! – ATG

0

通常在rake中,如果要为任务添加依赖项,则需要该任务的名称。所以你需要找出Rake::PackageTask注册的实际rake任务的名称。

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

(我相信buildr包任务的名称是它产生的软件包的文件名,但我不记得一定的。使用--trace找出来。)

+0

运行'rake package --trace'会在堆栈跟踪后产生以下结果:任务:TOP => package => target/library-1.0.tgz并添加'task'target/library-1.0.tgz“=> package_jar'到rakefile不会改变任何东西。它似乎仍然在寻找真正的JAR文件作为一项先决任务,奇怪的是。 – ATG

0

您可以添加一个依赖于任何通过写作任务,

someTask.enhance [other, tasks] 

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

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

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

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

这不行,恐怕。它失败了:“不知道如何构建任务”#',这似乎表明Rake :: PackageTask甚至不是一个适当的rake任务!有任何想法吗? – ATG