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

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

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

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

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 жалуется?

Я действительно нашел ответ, и я подумал, что поделюсь им здесь. См. Мой ответ ниже.

Ответ 1

Проблема в том, что другие библиотеки загружают более раннюю версию 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'

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

Ответ 2

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