ruby 为什么“gem”和“bundle”不使用相同的libxml2?

cgyqldqp  于 2022-11-04  发布在  Ruby
关注(0)|答案(2)|浏览(163)

我似乎陷入了一个循环的挫折中。我试图“捆绑安装”一个项目,但结果是:

An error occurred while installing nokogiri (1.6.6.2), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.6.2'` succeeds before bundling.

所以我试着说:

$ gem install nokogiri -v '1.6.6.2'
Building native extensions.  This could take a while...
Successfully installed nokogiri-1.6.6.2
Parsing documentation for nokogiri-1.6.6.2
Done installing documentation for nokogiri after 2 seconds
1 gem installed

一切都很好!除了当我运行“捆绑安装”时,我再次被告知我需要先得到“gem install nokogiri -v”1. 6. 6. 2“”来安装。啊啊啊。
mkmf.log文件表明这是libxml 2的一个问题(令人惊讶)。

conftest.c:3:10: fatal error: 'libxml/xmlversion.h' file not found

# include <libxml/xmlversion.h>

         ^
1 error generated.
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: #include <libxml/xmlversion.h>
4: 
5: #if LIBXML_VERSION < 20621
6: #error libxml2 is way too old
7: #endif
/* end */

因此,搜索libxml 2(使用“sudo find / -name libxml 2”)会显示以下目录,所有这些目录看起来都至少是2.9.0或更高版本:

  • /usr/包含/libxml 2
  • /usr/本机/储存格/libxml 2
  • /usr/本机/opt/libxml 2

那么,是不是找不到libxml 2的问题呢?如果是这样,我该如何使用bundle install来发现nokogiri已经安装了,或者至少能够像“gem install”那样安装它呢?虽然我很想找到解决方案,但我真的很想了解“幕后”发生了什么,这样我就可以在将来进行故障排除。

k3bvogb1

k3bvogb11#

在我的Mac OS X上,我运行了这些命令,问题得到了解决。

brew unlink gcc-4.2      # you might not need this step
gem uninstall nokogiri
xcode-select --install
gem install nokogiri
bybem2ql

bybem2ql2#

我知道这种令人沮丧的递归循环。事实上,我今天自己也在做这件事。不是用nokogiri,而是用libxml-ruby gem。我编译了一个小文档:
我的天啊
直接安装gem时可以传递--with-xml2-include参数。在bundler中安装时,可以首先执行bundle config命令,如下所示。
使用此命令针对系统libxml标头进行构建:
bundle config build.libxml-ruby --with-xml2-include=xcrun --show-sdk-path/usr/include/libxml2
如果您已经使用homebrew安装了libxml,请使用以下命令:
bundle config build.libxml-ruby --with-xml2-include=brew --prefix libxml2/usr/include/libxml2

**nokogiri怎么样?**我想这同样有助于解决在安装nokogiri gem时提到libxml的问题,尽管希望nokogiri更容易(也许自从你问了这个问题后,这在nokogiri中已经得到了改进),因为...

  • “nokogiri包括libxml2和libxslt的修改版本,但如果你选择自己打这场仗,也允许你使用系统libxml。无论如何,nokogiri在处理依赖性方面做得很好,所以它几乎可以在任何平台上工作。”*teeparham在2017年11月说

相关问题