【问题标题】:Nokogiri Ruby 'require' IssuesNokogiri Ruby 'require' 问题
【发布时间】:2014-01-28 12:58:45
【问题描述】:

我是 Ruby 新手,尝试使用 Nokogiri 时遇到了很多麻烦。几个小时以来,我一直在努力寻找解决方案,因此不胜感激。我尝试在其他相关 SO 帖子中搜索和使用解决方案,然后再发布我自己的帖子。当我运行ruby -v 时,我得到:ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]

(编辑:我已经用updates-alternatives --config ruby 更新了ruby 并选择了/usr/bin/ruby1.9.1,但是当我这样做时ruby -v 现在显示版本1.9.3 WTF 我在这里做错了吗?)

我在~/workspace/ruby/rubycrawler/ 有一个新项目目录,我使用Bundler 安装了正确安装的nokogiri:

Using mini_portile (0.5.2)
Using nokogiri (1.6.1)
Using bundler (1.5.1)
Your bundle is complete!

运行bundle show nokogiri 返回/var/lib/gems/1.9.1/gems/nokogiri-1.6.1。

在我运行脚本的目录中,我有一个名为“index.html”的简单 html 文件。我尝试运行的脚本甚至更简单(或者我是这么认为的):

require 'nokogiri'
page = Nokogiri::HTML(open("index.html"))
puts page.class    # Nokogiri::HTML::Document

错误是rubycrawler.rb:1:in 'require': no such file to load -- nokogiri (LoadError)。

我还添加了require 'rubygems',尽管我读到 1.9+ 不需要它并且仍然没有运气。

很多搜索显示“你把这个 gem 放在你的 Gemfile 中了吗?”。所以我生成了一个 Gemfile 并添加了gem 'nokogiri'。我尝试再次运行小脚本并得到相同的错误。我读了“尝试删除 Gemfile.lock。” 所以我做了,但仍然无法让它工作。然后我阅读并尝试在irb 中测试它,所以我测试了“open-uri”和“nokogiri”,这就是我得到的:

irb(main):001:0> require 'open-uri'
=> true
irb(main):003:0> require 'nokogiri'
LoadError: no such file to load -- nokogiri

我真的很难弄清楚这一点,所以真的非常感谢任何帮助。

【问题讨论】:

    标签: ruby linux gem nokogiri


    【解决方案1】:

    RVM、Bundler 等 Ruby 工具对新手来说似乎有很多魔力,但实际上,它们并没有什么魔力。这里的关键在于 Bundler 实际为您做了什么。它管理依赖项清单,但在运行时,这些依赖项仍然必须以某种方式加载,我的直觉是这里没有发生这种情况。

    无论您使用的是什么版本的 Ruby,如果您使用的是 Bundler,都有一种简单的方法可以做到这一点。在启动程序的命令之前加上“bundle exec”,这将使 Bundler 编辑 Ruby 的加载路径,使其包含清单 (Gemfile.lock) 中的所有内容。

    例如:

    $ bundle exec ruby foo.rb
    

    对于使用 RVM 的任何人的附加说明:RVM 通常会修改启动“ruby”或“rake”等程序的脚本中的 shebang,以便它们使用“ruby_no_exec”外壳(或类似外壳)而不是普通的旧“红宝石”外壳。该备用 shell 可识别 Bundler,因此通常无需键入“bundle exec”,但由于 OP 使用的是系统 Ruby,因此不适用,并且命令应手动添加前缀“bundle exec”。

    希望这会有所帮助!

    【讨论】:

    • 您好,感谢您的回复,但我对您的内容感到困惑(抱歉,如果我没有抓住重点)。当我做bundle exec ruby crawler.rb 时,我仍然收到相同的require: cannot load such file -- nokogiri/nokogiri (LoadError)。至于依赖项,我已经使用 sudo apt-get install libxslt-dev libxml2-dev. 安装了 nokogiri 依赖项
    • 如果您在应用目录中bundle console 然后require 'nokogiri' 会发生什么?
    • @Eugene 我收到了与“无法加载此类文件”完全相同的错误。
    • @SMT,你提到你是 Ruby 的新手,你解释的一切看起来都是正确的,除了你没有提到使用“bundle exec”。基于您在原始帖子中没有提到这一点,我猜测这可能是您的问题,但看来我猜错了。我同意尝试 Eugene 的建议作为进一步解决此问题的方法。
    • @KentRancourt 抱歉,如果我遗漏了那条信息,我已经尝试了很多事情,所以我漏掉了!顺便说一句,我很感激你的帮助,到目前为止,设置 Nokogiri 一直是一个巨大的痛苦,让我希望得到像 BeautifulSoup 模块这样的东西。最终,当我最终完成这项工作时,我希望这将是一次核心的学习体验。
    【解决方案2】:

    除了肯特的回答,我建议切换到 RVM 而不是使用系统安装的 ruby​​。系统红宝石往往非常过时,尤其是在涉及功能和安全更新等重要事项时。在您目前的情况下,它可能对您没有帮助,但值得花时间。如果您不熟悉:http://rvm.io

    【讨论】:

    • 感谢您的回复。我肯定会这样做,我已经在很多帖子上阅读过关于 RVM 的文章,我只是希望(或思考)我可以在没有 Nokogiri 的情况下启动并运行一些简单的东西。我正努力保持清醒,因为这让我想念 Python 的pip 哈哈的简单安装。
    • 对于它的价值,捆绑器不是必需的。它在处理 Rails 应用程序等时确实有帮助,但如果您想要全局安装 gem,您绝对可以使用 gem install <gemname>
    猜你喜欢
    • 2017-08-23
    • 1970-01-01
    • 2014-05-28
    • 2018-01-04
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多