我相信我误解了捆绑工具的工作方式,但是从bundle install
documentation来看,它似乎表明捆绑商将使用本地安装的系统宝石。
...
- system:安装到系统位置($ BUNDLE_PATH或$ GEM_HOME),即使该捆绑包先前已安装在此应用程序的其他位置
...
--system选项是默认选项。如下所述,在使用--path选项后将其传递回切换。
我没有使用rbenv / rvm或任何其他Ruby版本管理器。我使用ChefDK作为我的主要开发环境,它随附了Ruby和一堆预装的宝石。
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)
System 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
...
但是,当我运行bundle install时,它会尝试为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
我在输出中注意到Bundler已经禁用了共享gems。
$ 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并且不会尝试重新安装它。默认情况下,此设置不应存在,默认情况下,bundler将安装--system
。我必须在几个月前设置这个设置,忘了我做了。
答案 0 :(得分:6)
尝试运行bundle env
以验证安装位置是否符合预期。
如果没有,请检查是否有.bundle/config
或~/.bundle/config
文件覆盖安装路径。 bundle env
的输出将告诉您它使用的配置以及确定的配置(即,它所在的文件或是否从环境变量中获取)。
答案 1 :(得分:0)
尝试删除gemfile.lock文件的所有内容。保存文件。再次运行bundle install。
答案 2 :(得分:0)
有几种方法。在gemfile中,您可以指定强制bundle从那里使用的路径。
gem "my_gem", :path => "path to gem"
正如我所看到的问题是这里的默认路径。试着这样做。
答案 3 :(得分:0)
ChefDK不会在全球范围内安装宝石,它会在/opt/chefdk
下安装宝石,因此他们不会干扰您的宝石。全球宝石。我建议你把ChefDK宝石分开,因为它们应该是。
答案 4 :(得分:0)
您需要使用正确的bundler
和gem
。如果您正在使用ChefDK,那么它包含自己的bundler
和gem
可执行文件。它们应该在/opt/chefdk
目录中,我相信在/opt/chefdk/embedded
下(我不使用chefdk,所以我可以100%肯定)。
要在ruby安装中100%工作,您需要确保chefdk
二进制文件在其他与ruby相关的二进制文件之前的路径中。您可以使用which ruby
which gem
和which bundle
对其进行验证。
所有这一切,你真的不应该搞乱chefdk的ruby安装。它是嵌入式的一个原因,所以你不会意外搞砸它。我建议你坚持使用系统红宝石来做自己的工作,让厨师处理它的红宝石。
答案 5 :(得分:0)
来自Bundler docs:
- path:指定与系统默认路径不同的路径($ BUNDLE_PATH或$ GEM_HOME)。 Bundler将记住此值以供将来安装 这台机器
您的捆绑包可能已缓存指定的--path命令。 尝试:
bundle install --system
这将告诉bundler使用系统安装的gem,而不是将新的gem副本下载到特定于文件夹的gem集合。