Nokogiri是针对LibXML 2.7.7版本构建的,但动态加载了2.7.3

时间:2011-01-28 18:26:34

标签: 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会抱怨?

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

2 个答案:

答案 0 :(得分:14)

问题是其他库正在加载早期的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,请分享您的知识。)

最终,我找到了一个中途体面的解决方案。我决定,如果我无法解决这两个宝石之间的版本冲突,我至少会支持使用较新版本的libxml的Nokogiri。为此,我发现我的Gemfile中的哪些宝石正在使用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完全兼容。

答案 1 :(得分:6)

您也可以在应用的第一行require 'nokogiri'之前,在Bundle.require之前, - 然后您不必弄清楚其他依赖项是什么。