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

Sit*_*thu 5 ruby gem rubygems ruby-on-rails

我在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. 如何安装宝石vendor/bundle

p4s*_*sh4 6

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

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

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

  3. 没有.

  4. 你不应该.有这篇文章描述了如何做到这一点,但在我看来,

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

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

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

  • 我认为有一点很糟糕地传达了'bundle exec`是必需的以及为什么需要它,所以这就是人们通常认为应该在项目文件夹中安装依赖项的原因.此外,大多数其他包管理器(composer,npm,bower等)都这样做,因此不同的常见模式也可能令人困惑. (3认同)