我已经编写了一个非常简单的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
答案 0 :(得分:4)
这可以在全新的应用中重现。如果未将: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
(我知道这不是答案,但我还没有评论权限,这有望帮助讨论。)
答案 1 :(得分:2)
Rake任务可以运行两次有很多原因,在这个特定情况下,我认为它可能与Rake环境加载不止一次有关,因为@kucaahbe链接的问题表明。
我实际上在这里寻求帮助,但我的问题不同,我找到了答案。不要以为它会对这个问题有所帮助,但我也会把它留在这里。
在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
佣金任务。
无论如何,希望这有帮助。
答案 2 :(得分:0)
对我来说,由于我的测试文件中存在以下内容,因此我的rake应用程序在我的Rails应用程序中加载了两次:
User | max_cat_A(value) | max_cat_B(value) | mode(cat)
--------------------------------------------------------
1 | 5 | 5 | A
2 | 5 | 5 | B
3 | 5 | 5 | B
4 | 5 | 5 | A
我将其删除,任务被调用一次。
希望它会有所帮助。
对不起,我的英语。