仅调用一次时执行两次Rake任务

时间:2016-03-08 18:55:09

标签: ruby-on-rails ruby rake

我已经编写了一个非常简单的rake任务来尝试查找此问题的根源。

namespace :foo do
 task bar: :environment do
  puts 'RUNNING'
 end
end

在控制台rake foo:bar中执行时,输出为:

RUNNING
RUNNING

当我执行任何rake任务时会发生这种情况。有没有人遇到过这样的事情?

修改

上面的rake任务就是写在.rake文件中的所有内容。

这是目前使用的Rakefile。

require File.expand_path('../config/application', __FILE__)

OurApp::Application.load_tasks

此处还有运行--trace的输出。

** Invoke foo:bar (first_time)
** Invoke environment (first_time)
** Execute environment
Hostname is: ourhost
** Execute foo:bar
RUNNING
RUNNING

3 个答案:

答案 0 :(得分:4)

这可以在全新的应用中重现。如果未将:environment参数传递给rake任务,则问题将消失。

我将问题追溯到~/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb,我们针对此rake任务两次点击enhance()方法:

[99, 108] in /Users/inovakov/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb
    99:     # Enhance a task with prerequisites or actions.  Returns self.
   100:     def enhance(deps=nil, &block)
   101:       byebug if self.to_s.include? 'foo'
   102:       @prerequisites |= deps if deps
   103:       @actions << block if block_given?
=> 104:       self
   105:     end
   106: 
   107:     # Name of the task, including any namespace qualifiers.
   108:     def name
(byebug) @actions
[#<Proc:0x007ff492701aa0@/Users/inovakov/source/test_app/lib/tasks/foo.rake:4>, #<Proc:0x007ff4920d3f70@/Users/inovakov/source/test_app/lib/tasks/foo.rake:4>]

在第一次和第二次我们点击此方法之前,我们初始化了环境 - 在本例中为app/config/environments/development.rb

如果我们在rake任务中有两个输出,我们都会看到它们:

bash-3.2$ bundle exec rake foo:bar --trace
** Invoke foo:bar (first_time)
** Invoke environment (first_time)
** Execute environment
Hostname is: localhost
** Execute foo:bar
RUNNING
STILL RUNNING
RUNNING
STILL RUNNING

(我知道这不是答案,但我还没有评论权限,这有望帮助讨论。)

答案 1 :(得分:2)

Rake任务可以运行两次有很多原因,在这个特定情况下,我认为它可能与Rake环境加载不止一次有关,因为@kucaahbe链接的问题表明。

我实际上在这里寻求帮助,但我的问题不同,我找到了答案。不要以为它会对这个问题有所帮助,但我也会把它留在这里。

确保您的Rake环境仅加载一次

question linked by @kucaahbe之后,它表明如果您的环境正在加载并初始化Rake两次,就会发生这种情况。

在上下文中,已经需要并初始化Rake任务运行rake,因此请确保您的任务不包含以下行:

require 'rake'
...
Rake.application.init
Rake.application.load_rakefile

在这个特定的情况下,任务似乎没有做任何类型的事情,所以我会检查其他任务或Rakefile强迫Rake上下文加载两次。

在重新定义之前清除预先存在的任务

由于gem创建了一个具有相同名称的Rake任务,因此出现了这个问题。

例如,如果在Rails应用程序中声明以下任务:

namespace :assets do
  task :precompile do
    puts "Hello"
  end
end

并运行rake assets:precompile

...
I, [2017-07-31T11:25:09.498897 #9455]  INFO -- : Writing /home/pfac/...css.gz
Hello
Hello

但是如果你使用Rake::Task#clear

namespace :assets do
  task(:precompile).clear
  task :precompile do
    puts "Hello"
  end
end

它会禁用任何预先存在的行为,并仅打印Hello

我认为此选项不会解决此特定问题,除非@broc-broccoli已定义其他foo:bar佣金任务。

无论如何,希望这有帮助。

答案 2 :(得分:0)

对我来说,由于我的测试文件中存在以下内容,因此我的rake应用程序在我的Rails应用程序中加载了两次:

User | max_cat_A(value) | max_cat_B(value) | mode(cat)
--------------------------------------------------------
 1   | 5                | 5                | A
 2   | 5                | 5                | B
 3   | 5                | 5                | B
 4   | 5                | 5                | A

我将其删除,任务被调用一次。

希望它会有所帮助。

对不起,我的英语。