我应该在系统存储库(全局)还是项目供应商/软件包(本地)中安装ruby gems?

时间:2015-10-05 02:40:41

标签: ruby-on-rails ruby gem rubygems

我在Windows 7上使用Ruby 2.1和Rails 4.1。每当我运行bundle install时,所有宝石都安装在系统路径c:/Ruby21/lib/ruby/gems/2.1.0/gems/中。我还在项目中找到了vendor目录。

来自PHP composernode.js npm背景,所有依赖项应本地安装在项目vendor文件夹或node_modules文件夹中。所以,我的问题是:

  1. 我应该在系统路径或vendor/bundle中安装宝石吗?
  2. 如果系统路径中应安装所有宝石或某些宝石,那么它如何影响我可能无法访问shell的生产环境?
  3. 是否应在vendor/bundle
  4. 中安装所有宝石或特定宝石
  5. 如何在vendor/bundle
  6. 中安装宝石

1 个答案:

答案 0 :(得分:6)

当您运行bundle install时,您使用的是名为Bundler的工具。

  1. Bundler负责以与Composer类似的方式管理您的依赖项,但它不是在项目文件夹中安装所有内容,而是在系统范围内安装您的所有项目共享的gem。它通过使用项目文件夹中的Gemfile来跟踪哪个项目需要哪些库。所以,你应该让Bundler做它的事情,它做得很好,并且是Rails的标准包管理器。

  2. 如果您的主机支持Ruby和Rails应用程序(例如,像Heroku这样的PaaS),它肯定支持Bundler并且将安装所有必需的gem。如果您正在谈论没有shell访问的廉价共享主机,那么无论如何都无法在那里部署Ruby应用程序,因为您需要安装实际的Ruby解释器和其他需要shell访问的东西。

  3. 没有。

  4. 你不应该。有this article描述如何做到这一点,但在我看来

      

    无数次安装gems全局泄露到同一台机器上的其他项目中并导致令人讨厌的奇怪行为

    只发生在本文的作者身上,我认为Bundler没有错。在任何情况下,您应该始终在bundle exec之前添加gem命令(如在bundle exec rspec中),并且您将永远不会遇到上述问题。 bundle exec确保当您从gem执行命令时,调用Gemfile中定义的正确版本,如果您的系统中安装了相同gem的多个版本,则非常重要。

  5. 几年前,当RVM受欢迎时,gemsets实现了类似的目标,但rbenv和Bundler大部分都弃用了。