如何让我的Ruby宝石“机械化”工作?

时间:2019-02-07 02:10:25

标签: ruby rubygems mechanize

我需要为我正在上课的类安装Ruby gem'Mechanize',并使用它来做一个项目。我正在使用Windows,并且尝试使用rubyinstaller.org网站上的devkit安装2.6.1和2.5.3版本。安装完这些版本后,我完成了'gem install mechanize'任务,并且gem正确安装。但是,当我尝试甚至使用“ require'mechanize'”时,我得到了相当大的堆栈跟踪信息,而且我无法弄清楚出了什么问题。我尝试多次卸载并重新安装所有内容。

堆栈跟踪:

C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/net-http-persistent-3.0.0/lib/net/http/persistent.rb:205:in `<class:Persistent>': uninitialized constant Process::RLIMIT_NOFILE (NameError)
    from C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/net-http-persistent-3.0.0/lib/net/http/persistent.rb:190:in `<top (required)>'
    from C:/Ruby25-x64/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
    from C:/Ruby25-x64/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
    from C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/mechanize-2.7.6/lib/mechanize.rb:6:in `<top (required)>'
    from C:/Ruby25-x64/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:135:in `require'
    from C:/Ruby25-x64/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:135:in `rescue in require'
    from C:/Ruby25-x64/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:39:in `require'
    from test.rb:1:in `<main>'

任何帮助或建议将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:3)

在这颗宝石的依赖项中,这似乎是一个已知的Windows问题,请参见:uninitialized constant Process::RLIMIT_NOFILE (NameError)

您可以尝试使用此处提供的技巧,将这行放在您的要求之前

Process::RLIMIT_NOFILE = 7 if Gem.win_platform?
require 'mechanize'

如果您真的想成为ruby开发人员并且必须使用Windows,也可以尝试在某种虚拟化环境中运行ruby。参见Developing in Ruby on Windows

更新:这是一个已知问题,并非机械化,而是其依赖性之一,请参见this issue和建议的解决方法:

找到机械化宝石的源路径。您应该从运行中找到结果部分中显示的路径之一

 gem env
 #look for a section that says:
 - GEM PATHS:

从CD到步骤1的路径,然后在文本编辑器中进入lib/net/http/persistent.rb:并修改此内容:

查找并删除此行:

DEFAULT_POOL_SIZE = Process.getrlimit(Process::RLIMIT_NOFILE).first / 4

然后在其中添加以下内容:

if Gem.win_platform? then 
  DEFAULT_POOL_SIZE = 256
else
  DEFAULT_POOL_SIZE = Process.getrlimit(Process::RLIMIT_NOFILE).first / 4
end

并保存文件。请记住,如果您使用捆绑程序并计划运行bundle updatebundle upgrade,则将丢失这些更改。但这有望在将来的发行版中得到解决。我没有测试过,因为我不使用Windows,但是您可以尝试一下。