Bundler 安装 gem 已经安装
Bundler installing gem that's already installed
我相信我误解了捆绑器的工作方式,但从 bundle install
documentation 看来,它似乎表明捆绑器将使用本地安装的系统 gems。
...
--system: Install to the system location ($BUNDLE_PATH or $GEM_HOME) even if the bundle was previously installed somewhere else for this application
...
The --system option is the default. Pass it to switch back after using the --path option as described below.
我没有使用 rbenv/rvm 或任何其他 Ruby 版本管理器。我使用 ChefDK 作为我的主要开发环境,它附带 Ruby 和一堆预装的 gem。
Gem文件的全部内容,还没有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,因为它在许多不同的 developer/operations 工作站上始终失败,并且导致了无尽的悲伤。谢谢。
编辑
感谢 Tim Moore,使用 bundle env
我在输出中注意到捆绑器已禁用共享 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,并且不会尝试重新安装它。默认情况下不应存在此设置,默认情况下捆绑程序安装 --system
。我一定是几个月前设置了这个设置,但忘记了。
尝试删除 gemfile.lock 文件的所有内容。保存文件。 运行 再次捆绑安装。
有两种方法。在 gemfile 中,您可以指定从那里强制使用 bundle 的路径。
gem "my_gem", :path => "path to gem"
据我所知,问题出在此处的默认路径上。尝试这样做。
ChefDK 不会在全局范围内安装 gems,而是将它们安装在 /opt/chefdk
下,因此它们不会干扰 "your" 全局 gems。我建议您让 ChefDK gems 保持隔离状态。
您需要使用正确的 bundler
和 gem
。如果您使用的是 ChefDK,那么它包含自己的 bundler
和 gem
可执行文件。它们应该在 /opt/chefdk
目录内,我相信在 /opt/chefdk/embedded
下(我不使用 chefdk,所以我可以 100% 确定)。
要在 ruby 安装中 100% 工作,您需要确保 chefdk
二进制文件在其他 ruby 相关二进制文件之前位于您的路径中。您可以使用 which ruby
which gem
和 which bundle
来验证这一点。
综上所述,您真的不应该搞乱 chefdk 的 ruby 安装。它被嵌入是有原因的,这样你就不会不小心把它搞砸了。我建议您在自己的工作中坚持使用系统 ruby,让 Chef 处理它的 ruby.
尝试 运行 bundle env
验证安装位置是否符合您的预期。
如果没有,请检查是否有 .bundle/config
或 ~/.bundle/config
文件覆盖了安装路径。 bundle env
的输出将告诉您它正在使用什么配置以及它是如何确定的(即它在哪个文件中或者它是否是从环境变量中获取的)。
来自捆绑器 docs:
--path: Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME). Bundler will remember this value for future installs on
this machine
您的捆绑器可能缓存了 --path 指定的安装命令。
尝试:
bundle install --system
这将告诉捆绑程序使用安装的系统 gem,而不是将新的 gem 副本下载到特定文件夹 gem 集合。
我相信我误解了捆绑器的工作方式,但从 bundle install
documentation 看来,它似乎表明捆绑器将使用本地安装的系统 gems。
...
--system: Install to the system location ($BUNDLE_PATH or $GEM_HOME) even if the bundle was previously installed somewhere else for this application
...
The --system option is the default. Pass it to switch back after using the --path option as described below.
我没有使用 rbenv/rvm 或任何其他 Ruby 版本管理器。我使用 ChefDK 作为我的主要开发环境,它附带 Ruby 和一堆预装的 gem。
Gem文件的全部内容,还没有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,因为它在许多不同的 developer/operations 工作站上始终失败,并且导致了无尽的悲伤。谢谢。
编辑
感谢 Tim Moore,使用 bundle env
我在输出中注意到捆绑器已禁用共享 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,并且不会尝试重新安装它。默认情况下不应存在此设置,默认情况下捆绑程序安装 --system
。我一定是几个月前设置了这个设置,但忘记了。
尝试删除 gemfile.lock 文件的所有内容。保存文件。 运行 再次捆绑安装。
有两种方法。在 gemfile 中,您可以指定从那里强制使用 bundle 的路径。
gem "my_gem", :path => "path to gem"
据我所知,问题出在此处的默认路径上。尝试这样做。
ChefDK 不会在全局范围内安装 gems,而是将它们安装在 /opt/chefdk
下,因此它们不会干扰 "your" 全局 gems。我建议您让 ChefDK gems 保持隔离状态。
您需要使用正确的 bundler
和 gem
。如果您使用的是 ChefDK,那么它包含自己的 bundler
和 gem
可执行文件。它们应该在 /opt/chefdk
目录内,我相信在 /opt/chefdk/embedded
下(我不使用 chefdk,所以我可以 100% 确定)。
要在 ruby 安装中 100% 工作,您需要确保 chefdk
二进制文件在其他 ruby 相关二进制文件之前位于您的路径中。您可以使用 which ruby
which gem
和 which bundle
来验证这一点。
综上所述,您真的不应该搞乱 chefdk 的 ruby 安装。它被嵌入是有原因的,这样你就不会不小心把它搞砸了。我建议您在自己的工作中坚持使用系统 ruby,让 Chef 处理它的 ruby.
尝试 运行 bundle env
验证安装位置是否符合您的预期。
如果没有,请检查是否有 .bundle/config
或 ~/.bundle/config
文件覆盖了安装路径。 bundle env
的输出将告诉您它正在使用什么配置以及它是如何确定的(即它在哪个文件中或者它是否是从环境变量中获取的)。
来自捆绑器 docs:
--path: Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME). Bundler will remember this value for future installs on this machine
您的捆绑器可能缓存了 --path 指定的安装命令。 尝试:
bundle install --system
这将告诉捆绑程序使用安装的系统 gem,而不是将新的 gem 副本下载到特定文件夹 gem 集合。