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

8
我已经编写了一个非常简单的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

rails_12factor 会导致日志重复记录。如果你已经安装了它,请确保只在 :production 环境中加载它:gem 'rails_12factor', group: :production - infused
我们不使用rails_12factor,谢谢你的提示! - Broc Broccoli
请问您能否提供额外的代码?您是否需要 rake 或者可能是一个 Rake 文件?在谷歌上搜索“rake 执行两次”会有很多可能的原因,但大多数似乎都归结于不必要的多个 require 或初始化。 - engineersmnky
3
尝试运行rake foo:bar --trace,它会显示任务的顺序,这可能会让你知道是什么在调用特定任务两次。 - Dharam Gollapudi
从跟踪结果来看,任务似乎只运行了一次。您能否添加第二个puts,例如 puts "STILL RUNNING" 并向我们展示输出,以便我们可以排除可能的重复回显到控制台的情况? - Matouš Borák
希望这个讨论能帮到你:https://dev59.com/cY3da4cB1Zd3GeqPzGOQ - kucaahbe
4个回答

6
这个问题可以在一个全新的应用程序中复现。如果您不向rake任务传递:environment参数,则问题会消失。
我将问题追溯到~/.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

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


(译文)

6

有很多原因导致Rake任务运行两次,在这种情况下,我认为可能与Rake环境加载超过一次有关,就像@kucaahbe提出的问题所建议的那样。

实际上,我也在寻找帮助,但我的问题不同,我成功地找到了答案。不认为它会对这个特定的问题有帮助,但我也会把它放在这里。

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

根据 @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 rake任务。
无论如何,希望这可以帮到你。

1

对我来说,我的 Rake 环境在我的 Rails 应用程序中加载了两次,因为我的测试文件中存在以下内容:

setup do
  MyApp::Application.load_tasks
end

我将其移除后,任务被调用了一次。

希望能有所帮助。

对我的英语表示抱歉。


0
在我的情况下,我已经明确地添加了从 Rakefile 加载任务:
Rake.add_rakelib 'lib/tasks'

因此,删除这些 case 行可能会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接