如何在自定义Rails引擎gem中加载正确版本的动态库和gems(libxml,Nokogiri)?

Raf*_*ega 2 ruby ruby-on-rails libxml2 nokogiri rails-engines

我正在构建一个使用Nokogiri gem的rails引擎,我在MacOS 10.7和10.8中遇到了我的开发设置问题:

为了让Nokogiri在我的设置中正常工作,我更新了libxml和libxslt库:

brew update
brew install libxslt
brew upgrade libxml2
gem uninstall nokogiri
gem install nokogiri -- --with-xml2-include=/usr/local/Cellar/libxml2/2.9.0/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.9.0/lib --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.28
Run Code Online (Sandbox Code Playgroud)

如果我在"常规"rails应用程序中使用它,Nokogiri可以正常工作(将它包含在Gemfile中,运行bundle install).

当我尝试从我正在构建的Rails引擎中使用Nokogiri并使用我的应用程序作为宝石时出现问题.

在gemspec中:

s.add_dependency 'nokogiri' # XML parsing
Run Code Online (Sandbox Code Playgroud)

我还在Gem的Gemfile顶部尝试了以下内容:

gem 'nokogiri'
Run Code Online (Sandbox Code Playgroud)

当我启动一个使用我的Rails Engine gem的应用程序时,我收到以下警告:

WARNING: Nokogiri was built against LibXML version 2.9.0, but has dynamically loaded 2.7.8
Run Code Online (Sandbox Code Playgroud)

如何配置gem和/或bundler和/或Rails以使用正确版本的Nokogiri和libxml以及libxslt?

另外,这是输出 nokogiri -v

# Nokogiri (1.5.9)
    ---
    warnings: []
    nokogiri: 1.5.9
    ruby:
      version: 1.9.3
      platform: x86_64-darwin12.3.0
      description: ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.3.0]
      engine: ruby
    libxml:
      binding: extension
      compiled: 2.9.0
      loaded: 2.9.0
Run Code Online (Sandbox Code Playgroud)

edy*_*chk 9

将Rails Engine gem放在应用程序Gemfile的顶部.然后,在Rails引擎的gemspec和Gemfile中,确保在使用libxml的其他gem(如pg)之前有nokogori.

  • 这应该是谷歌的第一个结果! (2认同)