在 Rails 3 中,我注意到每次调用框架时,无论是从 rake
、rails 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/