我刚刚花了大部分时间解决这个警告。这个修复方法适用于使用Mac OS Lion的用户。上面的修复方法使用了...
bundle config build.nokogiri --with-xml2-include=/opt/local/include/libxml2 --with-xml2-lib=/opt/local/lib --with-xslt-dir=/opt/local
适用于通过MacPorts安装了libxml2的Snow Leopard。
对于Lion,libxml2作为引导流程的一部分被加载。无论Nokogiri指向哪个libxml2,Lion系统默认库中的libxml2将在运行时使用。Lion使用位于/usr
(而不是/usr/local
)的libxml2.2.7.3版本。
正如许多其他地方所提到的,可以忽略该警告。如果像我一样,该警告让您感到疯狂,可以执行以下操作:
bundle config build.nokogiri --with-xml2-dir=/usr --with-xslt-dir=/opt/local --with-iconv-dir=/opt/local
有趣的是,如果你在命令行中输入nokogiri -v
,你会得到相反的警告:
WARNING: Nokogiri was built against LibXML version 2.7.3, but has dynamically loaded 2.7.8
这表明 libxml2 的加载方式存在差异,Ruby 和 Rails 使用系统加载的 libxml2,而命令行使用环境路径中的 libxml2。无论如何,这对我来说消除了错误。
我再次强调,此方法仅适用于 Lion 操作系统。之前的修复方法适用于 Snow Leopard 操作系统。
这是答案的结尾,请不要继续阅读。
好吧,你没停下来看…那么...
不推荐!!!!!
你已经被警告了。你可以通过禁用 /usr/lib
中找到的 libxml2 来验证 Mac OSX 是否正在引导加载 libxml2 库。例如,将所有版本的 libxml2*.dylib
复制到 libxml2*.dylib.old
中(在我的机器上为 libxml2.2.7.3
、libxml2.2
和 libxml2
)。
完成后,运行 Nokogiri 将不会产生任何错误。这是因为它找不到已经加载的 libxml2,并且现在将遵循环境路径,最终在 /opt/local
中找到 libxml2.2.7.8
。
但是你将无法将旧的 libxml 文件复制回去。这是因为操作系统需要在引导中加载的 libxml2。
关机再开机会使你的机器变砖。登录界面将一直挂起。请按单用户模式关机并重新启动(同时按住 Command-S)。你可以观察引导过程。惊讶地发现,它会抛出一个无法加载 libxml2 的错误,然后停止工作。
关机后再次开机。这次进入恢复模式(要么按住 Command-R,要么按住 Option 并选择恢复盘)。在恢复模式下打开终端(utilities/terminal
)。将硬盘上的 /usr/lib
挂载(尝试 /Volumes/Macintosh\ HD/usr/lib
),并将 libxml2 文件复制回去。重启就没问题了。
brew remove --force libxml2
然后执行以下命令来重新配置 bundler:bundle config --delete build.nokogiri
最后卸载 nokogiri 和 libxml-ruby 两个 gem:gem uninstall nokogiri libxml-ruby
,然后运行bundle
。 - Nate Berkopec