Makefile任务重建尽管:intermediate => :假

时间:2015-02-16 06:42:07

标签: ruby-on-rails ruby bash makefile rake

问题

我正在尝试在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.filesource.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

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