Nokogiri был построен против LibXML версии 2.7.7, но динамически загружал 2.7.3 - PullRequest
10 голосов
/ 28 января 2011

В Rails 3 я заметил, что каждый раз, когда я вызываю фреймворк, будь то rake, rails server или что-то еще, я получаю следующее предупреждение:

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

ПоискGoogle выдает несколько постов в блоге, каждый из которых предлагает перестроить Nokogiri с использованием явного lib и включать пути.Например:

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 ]

14 голосов
/ 28 января 2011

Проблема в том, что другие библиотеки загружают более раннюю версию libxml. Я нашел это, комментируя вещи в моем Gemfile. В частности, в моем случае RMagick загружал libxml 2.7.3. (Он использует libxml для чтения файлов SVG.)

Я пытался пересобрать RMagick для libxml 2.7.7 примерно так:

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 снова. (Если кто-нибудь знает, как собрать RMagick для конкретной версии libxml, поделитесь своими знаниями.)

В конце концов, я нашел половинчатое решение. Я решил, что если я не смогу разрешить конфликт версий между этими двумя драгоценными камнями, я бы по крайней мере предпочел Nokogiri, который использует более новую версию libxml. Для этого я выяснил, какие драгоценные камни в моем Gemfile использовали Nokogiri, и поставил их на первое место.

Итак, хотя у меня когда-то было это:

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

Теперь у меня есть это:

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

Теперь предупреждение исчезло, а Рмагик еще не жаловался. Отказ от ответственности: я не использую SVG в своих приложениях, поэтому я не подтвердил, что RMagick полностью совместим с libxml 2.7.7.

6 голосов
/ 28 июня 2012

Вы также можете require 'nokogiri' в первой строке своего приложения, до Bundle.require, - тогда вам не нужно выяснять, каковы другие зависимости.

...