rake任务未按指定的顺序运行子任务

时间:2017-01-28 15:25:26

标签: ruby-on-rails ruby ruby-on-rails-4 rake bundler

在rails 4.2应用程序中,在Rakefile中,我有:

task(:default).clear
task :default => [:test, 'bundle:audit']

输出,总是有bundle:audit first first。那是为什么?

我在某些地方读过rake执行任务时出现依赖关系,但是bundle:审计,据我所知,不依赖于测试。它在这里定义:

https://github.com/rubysec/bundler-audit/blob/master/lib/bundler/audit/task.rb

1 个答案:

答案 0 :(得分:0)

引用comment在Rake的GitHub存储库中讨论相同的问题:

  

事实证明,您的问题是由于rails创建测试任务的方式:

desc "Run tests quickly by merging all types and not resetting db"
Rails::TestTask.new(:all) do |t|
  t.pattern = "test/**/*_test.rb"
end
     

https://github.com/rails/rails/blob/v4.2.7.1/railties/lib/rails/test_unit/testing.rake#L24-L27

     

这里Rails使用Rails :: TestTask来加载test:all目标,它将加载所有测试文件。

def define
  task @name do
    if ENV['TESTOPTS']
      ARGV.replace Shellwords.split ENV['TESTOPTS']
    end
    libs = @libs - $LOAD_PATH
    $LOAD_PATH.unshift(*libs)
    file_list.each { |fl|
      FileList[fl].to_a.each { |f| require File.expand_path f }
    }
  end
end
     

https://github.com/rails/rails/blob/v4.2.7.1/railties/lib/rails/test_unit/sub_test_task.rb#L106-L118

     

但与立即运行测试的Rake :: TestTask不同,Rails :: TestTask只需要运行测试所需的文件,然后依赖于Minitest中的at_exit处理程序来运行测试。这意味着运行测试时完全忽略了rake依赖项。

我更新了源代码的链接,因为讨论是关于Rails 4.1.8的,但问题仍然存在于Rails 4.2.7.1的源代码中。

此问题在GitHub上报告为issue to the Rails team,并已在此PR中修复。

说:自Rails 5.0.0以来,这个问题应该修复。