Ruby Bundler安装的gem是';它已经安装好了

Ruby Bundler安装的gem是';它已经安装好了,ruby,gem,chef-infra,bundler,Ruby,Gem,Chef Infra,Bundler,我相信我误解了bundler的工作方式,但从bundle安装来看,似乎表明bundler将使用本地安装的系统gems --系统:安装到系统位置($BUNDLE\u PATH或$GEM\u HOME),即使该BUNDLE以前是为该应用程序安装的 --system选项是默认选项。使用--path选项后,将其传递给switch back,如下所述 我没有使用rbenv/rvm或任何其他Ruby版本管理器。我使用ChefDK作为我的主要开发环境,它附带了Ruby和一些预装的gems Gemfile的

我相信我误解了bundler的工作方式,但从
bundle安装
来看,似乎表明bundler将使用本地安装的系统gems

--系统:安装到系统位置($BUNDLE\u PATH或$GEM\u HOME),即使该BUNDLE以前是为该应用程序安装的

--system选项是默认选项。使用--path选项后,将其传递给switch back,如下所述

我没有使用rbenv/rvm或任何其他Ruby版本管理器。我使用ChefDK作为我的主要开发环境,它附带了Ruby和一些预装的gems

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)
$ 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
...
系统Gem位置已安装nokogiri 1.6.3.1

$ gem list --local | grep nokogiri
nokogiri (1.6.6.2, 1.6.3.1, 1.5.5)
$ 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安装时,它会尝试为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.
...
我错过了什么?如何强制bundler使用已安装的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
一起安装。我必须在几个月前设置此设置,但我忘记了设置。

尝试删除gemfile.lock文件的所有内容。保存文件。再次运行bundle安装。

有几种方法。在gemfile中,您可以指定将强制bundle从此处使用的路径

gem "my_gem", :path => "path to gem"

正如我看到的,这里的问题是默认路径。尝试这样做。

ChefDK不会全局安装gems,它会在
/opt/ChefDK
下安装gems,这样它们就不会干扰“您的”全局gems。我建议你让切夫德克宝石保持原样

您需要使用合适的
捆绑机
gem
。如果您使用的是ChefDK,那么它包括自己的
bundler
gem
可执行文件。它们应该在
/opt/chefdk
目录下,我相信在
/opt/chefdk/embedded
下(我不使用chefdk,所以我可以100%确定)

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


综上所述,你真的不应该把chefdk的ruby安装搞得一团糟。它的嵌入是有原因的,这样你就不会不小心把它搞砸了。我建议您在自己的工作中使用系统ruby,并让Chef处理它的ruby。

尝试运行
bundle env
以验证安装位置是否符合您的预期

如果没有,请检查是否存在覆盖安装路径的
.bundle/config
~/.bundle/config
文件。
bundle env
的输出将告诉您它正在使用什么配置以及如何确定它(即,它在哪个文件中,或者它是否从环境变量中拾取)。

来自Bundler:

--路径:指定与系统默认路径不同的路径($BUNDLE\u path或$GEM\u HOME)Bundler将记住此值,以便将来在上安装 这台机器

您的捆绑程序可能缓存了--path指定的安装命令。 尝试:


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

这可能是因为其他gem将不同版本的nokogiri作为依赖项吗?但是Gemfile.Hm中只有一个gem。。这就是完整的文件。那好吧,不知道。你能把锁文件寄出去吗?gemfile lock是否存在版本差异?@0v3rc10ck3d我已删除了锁文件,只是尝试从头开始构建。不幸的是,这是在运行
bundle install
时没有
gemfile.lock
。感谢您的建议,不幸的是nokogiri没有。因此,我在/opt/chefdk/embedded/lib/ruby/gems/2.1.0/gems/nokogiri-1.6.3.1的源代码中找不到gem'nokogiri(>=0)ruby'。我使用Chef作为主要开发环境,所有本地安装的gem都进入
~/.chefdk
。我的目标是尝试并明确使用ChefDK安装的nokogiri,这样当其他Chef开发人员进行捆绑安装时,Bundler不会尝试安装nokogiri(从而导致编译过程失败),而是使用已经存在的nokogiri,这主要是为了烹饪书的开发。我在输出中得到这样的信息:
Bundler设置禁用当前用户的共享gems集(/Users/arthur/.bundle/config):“1”
,是吗?该设置确实禁用了
--system
的默认设置,但如果没有
路径设置,它通常不会自动出现。尝试显式运行
bundle install--system
重置为默认行为。就是这样!!就是那个场景<代码>--系统
是默认设置,这就是为什么我从未想到Bundler会做一些不同的事情。显然,在某个时候,我在我的
~/.BUNDLE/config
中放置了
BUNDLE\u DISABLE\u SHARED\u GEMS:'1'
,这就是为什么
--system
没有启用的原因。这完全可以解释,非常感谢!Bundler有点让人困惑,因为它保存标志,所以即使在干净的项目中,
--system
是默认的,如果您使用任何其他标志运行
bundle install
,这些标志也会存储在