【问题标题】:Rake task executing twice when only called once仅调用一次时执行两次 Rake 任务
【发布时间】:2016-03-08 18:55:08
【问题描述】:

我编写了一个非常简单的 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
  • 我们不使用 rails_12factor,不过感谢您的提示!
  • 能否提供额外的代码。您是否可能再次需要rake 或 rake 文件?谷歌搜索“rake 执行两次”有很多可能的原因导致这种情况发生,但其中大多数似乎归结为不需要它们的多个要求或初始化。
  • 尝试运行rake foo:bar --trace,它会显示任务的顺序。这可能会让您了解两次调用特定任务的原因。
  • 从跟踪来看,任务似乎只运行了一次。你可以添加第二个看跌期权,例如puts "STILL RUNNING" 并向我们展示输出,以便我们可以排除可能的双重回显到控制台?

标签: ruby-on-rails ruby rake


【解决方案1】:

这可以在全新的应用程序中重现。如果不将: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

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

【讨论】:

    【解决方案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 rake 任务。

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

    【讨论】:

      【解决方案3】:

      对我来说,我的 rake 环境在我的 rails 应用程序中加载了两次,因为我的测试文件中存在:

      setup do
        MyApp::Application.load_tasks
      end
      

      我删除了它,任务被调用了一次。

      希望对您有所帮助。

      对不起我的英语。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-19
        • 2017-02-16
        • 2012-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-28
        相关资源
        最近更新 更多