ruby-on-rails - Nokogiri 是针对 LibXML 版本 2.7.7 构建的,但已动态加载 2.7.3

标签 ruby-on-rails ruby nokogiri

在 Rails 3 中,我注意到每次调用框架时,无论是从 rakerails server 还是其他任何地方,我都会收到以下警告:

Nokogiri was built against LibXML version 2.7.7, but has dynamically loaded 2.7.3

在 Google 上搜索会得到一些博客文章,所有这些文章都建议使用显式库和包含路径重建 Nokogiri。例如:

http://mrflip.github.com/2009-08/nokogiri-hates-libxml2-on-osx.html

但是,这并没有解决我的问题。

输入 nokogiri -v 给我这个:

--- 
warnings: []

ruby: 
  engine: mri
  version: 1.8.7
  platform: i686-darwin10.4.0
libxml: 
  loaded: 2.7.7
  binding: extension
  compiled: 2.7.7
nokogiri: 1.4.4

这似乎表明我的构建没有问题,Nokogiri 正在加载正确的库版本。那么为什么 Rails 会提示呢?

我实际上找到了答案,我想我会在这里分享它。请参阅下面我的回答。

最佳答案

问题是其他库正在加载较早的 libxml 版本。我通过在我的 Gemfile 中注释掉东西发现了这一点。具体来说,在我的例子中,RMagick 正在加载 libxml 2.7.3。 (它使用 libxml 来读取 SVG 文件。)

我尝试像这样针对 libxml 2.7.7 重建 RMagick:

gem install --no-rdoc --no-ri rmagick -- --with-xml2-include=/opt/local/include/libxml2 --with-xml2-lib=/opt/local/lib --with-xslt-include=/opt/local/libxslt --with-xslt-lib=/opt/local/lib

然而,RMagick 似乎并不关心这些标志。它再次使用 2.7.3 构建。 (如果有人知道如何针对特定的 libxml 版本构建 RMagick,请分享您的知识。)

最终,我确实找到了一个半途而废的解决方案。我决定,如果我不能解决这两个 gem 之间的版本冲突,我至少会支持 Nokogiri,它使用更新版本的 libxml。为此,我找出我的 Gemfile 中的哪些 gem 使用了 Nokogiri,并将它们放在第一位。

所以,虽然我曾经有过这个:

gem 'rmagick', :require => 'RMagick'
gem 'sanitize' # Has Nokogiri as dependency

我现在有这个:

gem 'sanitize' # Has Nokogiri as dependency
gem 'rmagick', :require => 'RMagick'

现在警告消失了,RMagick 还没有提示。免责声明:我没有在我的应用程序中使用 SVG,所以我没有确认 RMagick 是否与 libxml 2.7.7 完全兼容。

关于ruby-on-rails - Nokogiri 是针对 LibXML 版本 2.7.7 构建的,但已动态加载 2.7.3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4831714/

相关文章:

mysql - 如何在 Rails 中有效地获取这些代理 ID

ruby-on-rails - Rspec Controller 测试通常是否太长?

ruby - 有人可以解释一下这段 ruby 代码吗

ruby-on-rails - 测试 Nokogiri XML 的属性

ruby - 使用 Nokogiri 检查 xml 响应是否具有类型 ="array"?

ruby-on-rails - 如何将已安装的 ruby​​ gem 包含在 Rails 中?

ruby-on-rails - Minitest集成测试: session not tearing down?

ruby-on-rails - Rails 4 app redirect_to 在发布请求后不重新加载网页

ruby - 安装新 Ruby gem 时 RDoc::TopLevel:Class 的未定义方法 `reset'

ruby-on-rails - RVM 正在加载错误版本的 ruby​​?