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

Bro*_*oli 5 ruby rake ruby-on-rails

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

namespace :foo do
 task bar: :environment do
  puts 'RUNNING'
 end
end
Run Code Online (Sandbox Code Playgroud)

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

RUNNING
RUNNING
Run Code Online (Sandbox Code Playgroud)

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

编辑

以上rake任务就是该.rake文件中编写的所有内容。

这是当前正在使用的Rakefile。

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

OurApp::Application.load_tasks
Run Code Online (Sandbox Code Playgroud)

这也是运行--trace的输出。

** Invoke foo:bar (first_time)
** Invoke environment (first_time)
** Execute environment
Hostname is: ourhost
** Execute foo:bar
RUNNING
RUNNING
Run Code Online (Sandbox Code Playgroud)

Iva*_*kov 5

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

我将问题追溯到针对此rake任务~/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb我们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>]
Run Code Online (Sandbox Code Playgroud)

在第一次和第二次之间,我们使用此方法初始化环境-在这种情况下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
Run Code Online (Sandbox Code Playgroud)

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


pfa*_*fac 5

Rake 任务可能运行两次的原因有很多,在这种特定情况下,我认为这可能与 Rake 环境加载不止一次有关,正如@kucaahbe链接的问题所暗示的那样。

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

确保你的 Rake 环境只加载一次

按照@kucaahbe 链接问题,它表明如果您的环境正在加载和初始化 Rake 两次,就会发生这种情况。

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

require 'rake'
...
Rake.application.init
Rake.application.load_rakefile
Run Code Online (Sandbox Code Playgroud)

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

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

由于 gem 创建了一个同名的 Rake 任务,因此遇到了这个问题。

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

namespace :assets do
  task :precompile do
    puts "Hello"
  end
end
Run Code Online (Sandbox Code Playgroud)

并运行rake assets:precompile

...
I, [2017-07-31T11:25:09.498897 #9455]  INFO -- : Writing /home/pfac/...css.gz
Hello
Hello
Run Code Online (Sandbox Code Playgroud)

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

...
I, [2017-07-31T11:25:09.498897 #9455]  INFO -- : Writing /home/pfac/...css.gz
Hello
Hello
Run Code Online (Sandbox Code Playgroud)

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

我不认为这个选项可以解决这个特定的问题,除非@broc-broccoli已经定义了其他的foo:barrake 任务。

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