如果我在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命令时它为什么不显示。 有什么区别。
答案 0 :(得分:6)
混淆来自捆绑者正在解决的问题。
当您将Gems安装到系统范围的宝石存储库中时,一旦有了几个应用程序,就会有多个版本的宝石。
因此,例如,您最终可能会得到3个Rails版本:3.2.8,3.2.6和3.1.0
如果您执行require rails
rubygems可以使用这些版本中的任何一个,如果您最初针对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。