我正在尝试在Rake中使用phony tasks,以防止强制重建我的FileTasks。
(摘自GitHub上的ruby/lib/rake/phony.rb
)
# Defines a :phony task that you can use as a dependency. This allows
# file-based tasks to use non-file-based tasks as prerequisites
# without forcing them to rebuild.
尽管使用:phony
任务,我的FileTasks仍在重建。我举了一个例子来证明这一点。
我们需要使用final.file
任务从source.file
构建:intermediate
。
如果final.file
与source.file
过期,则应仅重建。但是,将:intermediate
列为先决条件,每次都会强制重建。
使用rake/phony
和:phony
任务作为先决条件应该解决这个问题,但不是。
require 'rake/phony'
task :default => 'final.file'
file 'final.file' => ['source.file', :intermediate] do |f|
touch f.name
end
# Marked as phony, so should not force FileTask to rebuild
task :intermediate => [:phony] do |t|
puts "#{t.name} task"
end
$ touch source.file # Create the source file
$ rake # Run Rake to build 'final.file'
intermediate task
touch final.file
$ rake # Rake should NOT rebuild, but does. <<<<<<<<
intermediate task
touch final.file
正如您所看到的,我使用的是更新版本的Rake,而不是引入虚假任务的版本(0.9.4),因此:phony
应该有效。
$ ruby -v
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin14]
$ rake -V
rake, version 10.4.2
答案 0 :(得分:0)
我猜rake / phony是宝石?这不是耙子里面的东西,我不认为,我以前从未见过它。
也许这个? https://github.com/floere/phony但这似乎与你所谈论的内容无关,所以也许不是这样,而你正在使用别的东西。
无论您使用的是什么,您都可以尝试在他们的github上发布一个问题,或者如果他们的自述文件有其他首选方法来接收问题,则可以向他们提问。它可能是那个宝石中的一个错误,或者宝石可能没有达到预期效果。
很可能很少有读者熟悉这个宝石,无论如何都没有兴趣阅读您粘贴大量源代码的冗长帖子/问题。
由于我们不知道它是什么或它应该做什么,我们真的没有办法知道它是否是该宝石中的错误或者你做错了,而且有很多互联网上的人通过回答关于他们熟悉的事物的目标问题来享受帮助,很少有人喜欢经历一个模糊的措辞“我做错了什么还是坏了?”在他们不熟悉的东西上贴上巨大的源材料的问题。
答案 1 :(得分:0)
我认为lib / rake / task.rb的定义是&#34; timestamp&#34;方法
我认为这应该是:
def timestamp # on Task
prerequisite_tasks.collect { |pre| pre.timestamp }.max || Time.now
end
我在此页面中找到了此信息: http://blog.zenspider.com/blog/2012/01/simulating-phony-in-rake.html
所以修复它的一个方法就是重新打开Task类并重新定义timestamp方法,如下所示:
require 'rake/phony'
task :default => %w[targetA]
file targetA: :test do |t|
sh "touch #{t.name}"
end
task :test do |t|
p t.name
end
task :test => :phony
class Rake::Task
def timestamp
prerequisite_tasks.collect { |pre| pre.timestamp }.max || Time.now
end
end