Rake“已经初始化常量WFKV_”警告

33

尝试运行rake cucumber:ok时出现以下错误:

/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rack-1.3.4/lib/rack/backports/uri/common_192.rb:53: warning: already initialized constant WFKV_

然后:
Command failed with status (1): [/Users/dev/.rbenv/versions/1.9.2-p290/bin...]

我对Rails还很陌生,谷歌搜索也没有结果。

编辑:我已经尝试添加bundle exec,但没有任何改变。

这是我用--trace得到的结果:

/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/file_utils.rb:53:in `block in create_shell_runner'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/file_utils.rb:45:in `call'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/file_utils.rb:45:in `sh'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/file_utils_ext.rb:36:in `sh'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/cucumber-1.1.0/lib/cucumber/rake/task.rb:104:in `run'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/cucumber-1.1.0/lib/cucumber/rake/task.rb:193:in `block in define_task'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:205:in `call'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:205:in `block in execute'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:200:in `each'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:200:in `execute'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:158:in `block in invoke_with_call_chain'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:151:in `invoke_with_call_chain'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:144:in `invoke'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:112:in `invoke_task'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:90:in `block (2 levels) in top_level'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:90:in `each'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:90:in `block in top_level'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:129:in `standard_exception_handling'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:84:in `top_level'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:62:in `block in run'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:129:in `standard_exception_handling'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:59:in `run'
/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rake-0.9.2/bin/rake:32:in `<top (required)>'
/Users/dev/.rbenv/versions/1.9.2-p290/bin/rake:19:in `load'
/Users/dev/.rbenv/versions/1.9.2-p290/bin/rake:19:in `<main>'
Tasks: TOP => cucumber:ok
4个回答

51

今晚开始我也遇到了同样的问题。看起来与 Rack 1.3.4 相关。我通过在 Gemfile 中添加以下内容来解决它:

gem 'rack', '1.3.3'

然后运行:

bundle update rack

顺便说一下,在这之前我尝试了 Bozhidar 的建议,但是没有成功。


14
从common_192.rb的注释中可以看出,这段代码是从Ruby核心库的uri/common.rb @ 32618ba中"盗用"过来的,以修复1.9.2版本中的DoS问题。看起来这是为了防止拒绝服务攻击而在rack中加入的。它有意地对Ruby中的一个漏洞进行了猴子补丁,但是这个猴子补丁会导致“已初始化常量”的警告。因此,选择要么像Daniel建议的那样回退到1.3.3版本,要么获取修复程序并忍受一段时间的警告信息。 - Brian Morearty
1
在我的情况下,这个警告阻止了资产管道的预编译,所以回退到1.3.3是唯一的选择。 - Daniel Situnayake
4
针对这个问题的修复已经添加 - https://github.com/rack/rack/commit/235f83cb88650beaa7fd0089ee0d19ca46507fc0 - 所以应该会在下一个rack版本中发布。如果你确实因为某些原因需要rack 1.3.4,你可以在require rack之前执行类似于require 'uri/common'; ::URI.send :remove_const, :WFKV_的操作。它甚至可以在你的Gemfile中工作。 - matt
1
只是一个小提示:我不会执行bundle update,而是执行bundle update rackbundle update将会更新所有的gems。 - yekta

8

Rack 1.3.5已经发布,该版本修复了这个警告。


0
你应该卸载 rake-0.9.2 并安装 rack 1.6.13。
gem uninstall rake
gem install  rack 1.6.13

-1

所以,我包含了:

require 'uri/common'; ::URI.send :remove_const, :WFKV_

然而,注释中说它在Gemfile中会起作用,实际上应该是"必须在Gemfile中。"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接