Bundler安装已安装的gem

时间:2015-03-13 13:10:40

标签: ruby gem chef bundler

我相信我误解了捆绑工具的工作方式,但是从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。我必须在几个月前设置这个设置,忘了我做了。

6 个答案:

答案 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)

您需要使用正确的bundlergem。如果您正在使用ChefDK,那么它包含自己的bundlergem可执行文件。它们应该在/opt/chefdk目录中,我相信在/opt/chefdk/embedded下(我不使用chefdk,所以我可以100%肯定)。

要在ruby安装中100%工作,您需要确保chefdk二进制文件在其他与ruby相关的二进制文件之前的路径中。您可以使用which ruby which gemwhich bundle对其进行验证。

所有这一切,你真的不应该搞乱chefdk的ruby安装。它是嵌入式的一个原因,所以你不会意外搞砸它。我建议你坚持使用系统红宝石来做自己的工作,让厨师处理它的红宝石。

答案 5 :(得分:0)

来自Bundler docs

  

- path:指定与系统默认路径不同的路径($ BUNDLE_PATH或$ GEM_HOME)。 Bundler将记住此值以供将来安装   这台机器

您的捆绑包可能已缓存指定的--path命令。 尝试:

bundle install --system

这将告诉bundler使用系统安装的gem,而不是将新的gem副本下载到特定于文件夹的gem集合。