仅调用一次时执行两次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 

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

我将问题追溯到~/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb ,其中我们针对此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 [#, #] 

在第一次和第二次之间我们点击这个方法我们初始化环境 – 在这种情况下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 

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

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

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

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

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

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

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

在这个特定的情况下,任务似乎没有做任何类型的事情,所以我会检查其他任务或Rake文件强制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任务。

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

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

 setup do MyApp::Application.load_tasks end 

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

希望它可以提供帮助。

对不起我的英语不好。