bundle show gemname和gem list gemname之间的区别

时间:2012-12-04 10:14:04

标签: ruby-on-rails gem

如果我在rails命令提示符中执行 gem list rack-cache ,那么它会显示没有该名称的gem但是如果我 bundle show rack -cache 然后它给了我像 /vendor/bundle/ruby/1.9.1/gems/rack-cache-1.2 这样的路径存放宝石的地方。

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

3 个答案:

答案 0 :(得分:6)

混淆来自捆绑者正在解决的问题。

当您将Gems安装到系统范围的宝石存储库中时,一旦有了几个应用程序,就会有多个版本的宝石。

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

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

Bundler所做的是准确安装Gemfile.lock中指定的gem,并将其锁定以供该应用程序使用。 Bundler因此修改了rubygems的加载路径,因此只有Gemfile.lock中的Gems才能真正用于该应用程序。

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

答案 1 :(得分:2)

捆绑秀:

显示属于捆绑包的所有宝石,或指定给定宝石的路径

$ bundle show [GEM] [--paths]

在Mac上处于开发模式时,gems仍会安装在默认的gem路径中,而在生产模式下,它们会安装在特定于项目的文件夹中。尝试在每台机器上进行捆绑显示导轨,你会看到我的意思。

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

请参阅http://gembundler.com/rationale.html#deploying-your-application了解此

背后的基本原理

答案 2 :(得分:1)

bundle show gem list

之间存在细微差别

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