2015-03-13 126 views
2

我相信我误解了bundler的工作方式,但从bundle installdocumentation看来,这表明bundler会使用本地安装的系统宝石。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) 

系统宝石的位置具有引入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 
... 

然而,当我运行一个安装包,它试图安装和编译的libxml2为引入nokogiri。

$ 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,因为它在许多不同的开发/操作工作站上一直失败,并且导致无法结束。谢谢。

编辑

感谢蒂姆·摩尔,使用bundle env我注意到在捆绑了共享宝石禁用输出。

$ 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

难道这是因为一些其他的宝石拉着不同版本的nokogiri作为依赖吗? – Almaron 2015-03-13 14:03:24

+0

但Gemfile中只有一个gem。 – 2015-03-13 14:18:07

+0

嗯..所以这是完整的Gemfile。那么,斯瑞不知道。 – Almaron 2015-03-13 14:24:13

回答

6

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

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

+0

我在输出中得到:'Bundler设置 disable_shared_gems 为当前用户设置(/Users/arthur/.bundle/config):“1”',是吗? – 2015-03-23 19:45:18

+0

该设置确实禁用了“--system”的默认设置,但是如果没有'path'设置,它通常不会自动出现。尝试明确运行'bundle install --system'以重置为默认行为。 – 2015-03-23 23:25:26

+0

就是这样!这是设定! '--system'是默认的,这就是为什么我从来没有想到Bundler会做一些不同的事情。显然,在某些时候,我在'〜/ .bundle/config'中放了'BUNDLE_DISABLE_SHARED_GEMS:'1'',这就是为什么' - system'没有被启用的原因。这完全解释它,非常感谢你! – 2015-03-24 03:28:33

0

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

+0

不幸的是,这是在没有'Gemfile.lock'的情况下运行'bundle install'。 – 2015-03-13 15:23:26

0

有几种方法。在gemfile中你可以指定强制bundle从那里使用的路径。

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

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

+0

感谢您的建议,不幸的是nokogiri没有[包括gemspec](https://github.com/sparklemotion/nokogiri/blob/master/Y_U_NO_GEMSPEC.md)。所以我得到'在/opt/chefdk/embedded/lib/ruby/gems/2.1.0/gems/nokogiri-1.6.3.1源代码找不到gem'nokogiri(> = 0)ruby'。' – 2015-03-13 17:14:17

0

ChefDK不会在全球安装宝石,它将它们安装在/opt/chefdk之下,以免它们干扰“您的”全球宝石。我建议你离开ChefDK宝石,因为他们应该是孤立的。

+0

我使用Chef作为主要开发环境,并且所有本地安装的gem进入'〜/ .chefdk'。我的目标是尝试明确地*使用ChefDK安装的nokogiri,所以当其他Chef开发人员执行'bundle install'时,Bundler不会尝试安装nokogiri(因此编译过程失败),而是使用已经存在的nokogiri。 – 2015-03-16 23:29:22

0

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

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

所有的说法,你真的不应该搞乱chefdk的红宝石安装。它是有原因的,所以你不会意外地搞乱它。我建议你坚持使用系统红宝石来做你自己的工作,并让厨师处理它的红宝石。

+0

我正在使用[ChefDK作为我的主要开发环境](https://github.com/chef/chef-dk#using-chefdk-as-your-primary-development-environment),并且大部分是用于烹饪书的开发。 – 2015-03-21 20:07:05

0

从捆扎机docs

--path:指定比系统默认($ BUNDLE_PATH或$ GEM_HOME)不同的路径。为今后 本机

你捆绑可能已经缓存在--path指定的安装命令安装捆扎机会记住这个值。 尝试:

bundle install --system 

这会告诉打捆使用系统安装宝石,而不是下载新的宝石拷贝到文件夹特定宝石收藏。