Bro*_*oli 5 ruby rake ruby-on-rails
我编写了一个非常简单的rake任务,尝试查找此问题的根源。
namespace :foo do
task bar: :environment do
puts 'RUNNING'
end
end
Run Code Online (Sandbox Code Playgroud)
在控制台中执行时,rake foo:bar输出为:
RUNNING
RUNNING
Run Code Online (Sandbox Code Playgroud)
当我执行任何耙任务时,会发生这种情况。有人遇到过这样的事情吗?
编辑
以上rake任务就是该.rake文件中编写的所有内容。
这是当前正在使用的Rakefile。
require File.expand_path('../config/application', __FILE__)
OurApp::Application.load_tasks
Run Code Online (Sandbox Code Playgroud)
这也是运行--trace的输出。
** Invoke foo:bar (first_time)
** Invoke environment (first_time)
** Execute environment
Hostname is: ourhost
** Execute foo:bar
RUNNING
RUNNING
Run Code Online (Sandbox Code Playgroud)
这可以在全新的应用程序中重现。如果不将:environment参数传递给rake任务,该问题将消失。
我将问题追溯到针对此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
[#<Proc:0x007ff492701aa0@/Users/inovakov/source/test_app/lib/tasks/foo.rake:4>, #<Proc:0x007ff4920d3f70@/Users/inovakov/source/test_app/lib/tasks/foo.rake:4>]
Run Code Online (Sandbox Code Playgroud)
在第一次和第二次之间,我们使用此方法初始化环境-在这种情况下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
Run Code Online (Sandbox Code Playgroud)
(我知道这不是一个答案,但我还没有评论权限,这有望对讨论有所帮助。)
Rake 任务可能运行两次的原因有很多,在这种特定情况下,我认为这可能与 Rake 环境加载不止一次有关,正如@kucaahbe链接的问题所暗示的那样。
我实际上是来这里寻求帮助的,但我的问题有所不同,我设法找到了答案。不要认为这对这个特定问题有帮助,但我也会把它留在这里。
按照@kucaahbe 链接的问题,它表明如果您的环境正在加载和初始化 Rake 两次,就会发生这种情况。
在上下文rake中,已经需要并初始化了 Rake 任务运行,因此请确保您的任务不包含以下行:
require 'rake'
...
Rake.application.init
Rake.application.load_rakefile
Run Code Online (Sandbox Code Playgroud)
在这种特定情况下,任务似乎没有做任何类似的事情,所以我会检查其他任务或Rakefile强制 Rake 上下文加载两次的东西。
由于 gem 创建了一个同名的 Rake 任务,因此遇到了这个问题。
例如,如果您在 Rails 应用程序中声明以下任务:
namespace :assets do
task :precompile do
puts "Hello"
end
end
Run Code Online (Sandbox Code Playgroud)
并运行rake assets:precompile:
...
I, [2017-07-31T11:25:09.498897 #9455] INFO -- : Writing /home/pfac/...css.gz
Hello
Hello
Run Code Online (Sandbox Code Playgroud)
但是如果你使用Rake::Task#clear:
...
I, [2017-07-31T11:25:09.498897 #9455] INFO -- : Writing /home/pfac/...css.gz
Hello
Hello
Run Code Online (Sandbox Code Playgroud)
它禁用任何预先存在的行为并仅打印Hello.
我不认为这个选项可以解决这个特定的问题,除非@broc-broccoli已经定义了其他的foo:barrake 任务。
无论如何,希望这会有所帮助。
| 归档时间: |
|
| 查看次数: |
1265 次 |
| 最近记录: |