【发布时间】:2015-03-13 13:10:40
【问题描述】:
我相信我误解了 bundler 的工作方式,但从 bundle install documentation 看来,这似乎表明 bundler 将使用本地安装的系统 gem。
...
--system: 安装到系统位置($BUNDLE_PATH 或 $GEM_HOME),即使该捆绑包之前已为此应用程序安装在其他位置
...
--system 选项是默认选项。如下所述,在使用 --path 选项后将其传递给切换回来。
我没有使用 rbenv/rvm 或任何其他 Ruby 版本管理器。我使用 ChefDK 作为我的主要开发环境,它附带 Ruby 和一堆预安装的 gem。
Gemfile的全部内容,还没有Gemfile.lock。
source 'https://rubygems.org'
gem 'nokogiri', '1.6.3.1'
已安装本地 nokogiri
$ gem list --local | grep nokogiri
nokogiri (1.6.6.2, 1.6.3.1, 1.5.5)
系统 Gem 位置已安装 nokogiri 1.6.3.1
$ echo $GEM_HOME
/Users/arthur/.chefdk/gem/ruby/2.1.0
$ find /Users/arthur/.chefdk/gem/ruby/2.1.0 | grep nokogiri | grep 1.6.3.1
/Users/arthur/.chefdk/gem/ruby/2.1.0/cache/nokogiri-1.6.3.1.gem
/Users/arthur/.chefdk/gem/ruby/2.1.0/extensions/x86_64-darwin-12/2.1.0/nokogiri-1.6.3.1
/Users/arthur/.chefdk/gem/ruby/2.1.0/extensions/x86_64-darwin-12/2.1.0/nokogiri-1.6.3.1/mkmf.log
/Users/arthur/.chefdk/gem/ruby/2.1.0/gems/nokogiri-1.6.3.1
/Users/arthur/.chefdk/gem/ruby/2.1.0/gems/nokogiri-1.6.3.1/.autotest
/Users/arthur/.chefdk/gem/ruby/2.1.0/gems/nokogiri-1.6.3.1/.editorconfig
...
但是,当我运行捆绑安装时,它会尝试为 nokogiri 安装和编译 libxml2。
$ bundle install
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Using mini_portile 0.6.0
Building nokogiri using packaged libraries.
Building libxml2-2.8.0 for nokogiri with the following patches applied:
- 0001-Fix-parser-local-buffers-size-problems.patch
- 0002-Fix-entities-local-buffers-size-problems.patch
- 0003-Fix-an-error-in-previous-commit.patch
- 0004-Fix-potential-out-of-bound-access.patch
- 0005-Detect-excessive-entities-expansion-upon-replacement.patch
- 0006-Do-not-fetch-external-parsed-entities.patch
- 0007-Enforce-XML_PARSER_EOF-state-handling-through-the-pa.patch
- 0008-Improve-handling-of-xmlStopParser.patch
- 0009-Fix-a-couple-of-return-without-value.patch
- 0010-Keep-non-significant-blanks-node-in-HTML-parser.patch
- 0011-Do-not-fetch-external-parameter-entities.patch
************************************************************************
IMPORTANT! Nokogiri builds and uses a packaged version of libxml2.
...
我错过了什么?如何强制捆绑器使用已安装的 nokogiri 1.6.3.1(随 ChefDK 提供)?我试图避免让 nokogiri 编译 libxml2,因为这在许多不同的开发人员/操作工作站上始终失败并且造成了无尽的悲痛。谢谢。
编辑
感谢 Tim Moore,使用 bundle env 我在输出中注意到捆绑器已禁用共享 gem。
$ bundle env
Bundler 1.7.12
Ruby 2.1.4 (2014-10-27 patchlevel 265) [x86_64-darwin12.0]
Rubygems 2.4.4
GEM_HOME /Users/arthur/.chefdk/gem/ruby/2.1.0
GEM_PATH /Users/arthur/.chefdk/gem/ruby/2.1.0:/opt/chefdk/embedded/lib/ruby/gems/2.1.0
Bundler settings
disable_shared_gems
Set for the current user (/Users/arthur/.bundle/config): "1"
Gemfile
source 'https://rubygems.org'
...
查看~/.bundle/config,果然设置了全局配置。
---
BUNDLE_DISABLE_SHARED_GEMS: '1'
一旦删除,Bundler 会正确解析 nokogiri 1.6.3.1,并且不会尝试重新安装它。默认情况下,此设置不应该存在,默认情况下捆绑程序使用--system 安装。我一定是在几个月前设置了这个设置,但我忘记了。
【问题讨论】:
-
这可能是因为其他一些 gem 正在将不同版本的 nokogiri 作为依赖项拉取吗?
-
但是 Gemfile 中只有一个 gem。
-
嗯.. 这就是完整的 Gemfile。对不起,不知道。
-
你能发布锁定文件吗? gemfile 锁有什么版本差异吗?
-
@0v3rc10ck3d 我已经删除了锁定文件,只是想从头开始构建。
标签: ruby gem chef-infra bundler