2

如果我在 rails 命令提示符中执行gem list rack-cache,那么它不会显示具有该名称的 gem,但是如果我执行bundle show rack-cache那么它会为我提供/vendor/bundle/ruby/1.9.1/gems/rack之类的路径-cache-1.2存储 gem 的位置。

我不理解这种行为,因为如果 gem 存在于后一个命令的路径中,那么为什么当我给出 gem list rack-cache 命令时它不显示。有什么不同。

4

3 回答 3

6

混乱来自捆绑器正在解决的问题。

当您将 Gems 安装到系统范围的 gem 存储库中时,一旦您拥有几个应用程序,您最终会得到多个版本的 gem。

因此,例如,您最终可能会得到 3 个 Rails 版本:3.2.8、3.2.6 和 3.1.0

如果您做一个require railsruby​​gems 可以使用这些版本中的任何一个,并且如果您最初针对 3.1.0 构建的应用程序与 3.2.8 中的某些更改不兼容,那么您最终会感到困惑。

bundler 所做的是准确安装 Gemfile.lock 中指定的 gem,并锁定它们以供该应用程序使用。因此,Bundler 修改了 ruby​​gem 的加载路径,因此只有 Gemfile.lock 中的 Gem 对应用程序真正可用。

因此bundle install,不是将 gems 安装到系统范围的 gem 目录中,而是安装到每个项目的不同路径。这就是为什么您在捆绑程序目录中而不是系统范围内看到 gem。如果您rack-cache通过安装,gem install您还将在gem list.

于 2012-12-04T10:29:21.850 回答
2

bundle show和之间有一个小的区别gem list

bundle show将列出您当前应用程序中安装的所有 gem [您可以在 Gemfile.lock 文件中看到它们],其中gem list将列出安装在任何gemset设置为使用的任何 gem 下的所有 gem。
bundle show gem_name将给出路径。
gem list gem_name将与安装到本地 gem 或 gemset 中的所有版本提供相同的 gem_name。

于 2012-12-04T10:37:22.160 回答
2

捆绑展示:

显示作为捆绑包一部分的所有 gem,或给定 gem 的路径

$ 捆绑显示 [GEM] [--paths]

在 Mac 上处于开发模式时,gem 仍会安装在默认 gem 路径中,而在生产模式下,它们会安装在特定于项目的文件夹中。试着在每台机器上做一个 bundle show rails ,你就会明白我的意思了。

当您运行 gem list 时,它会在主 gem 文件夹中查找,并且由于您的生产 gem 位于特定于项目的文件夹中,因此 global gem 命令不知道要查找那里。因此,您将需要执行 bundle exec 以在服务器上运行任何这些项目特定的 gemscommands。出于我的目的,我为 bundle exec 创建了一个别名。此外,要列出项目的 gem,您可以执行 bundle list。

请参阅http://gembundler.com/rationale.html#deploying-your-application了解这背后的基本原理

于 2012-12-04T10:41:12.610 回答