仅调用一次时执行两次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
我删除了它,并调用了一次任务。
希望它可以提供帮助。
对不起我的英语不好。