Rubygems、Bundler 和 RVM 之间的关系
Posted
技术标签:
【中文标题】Rubygems、Bundler 和 RVM 之间的关系【英文标题】:Relationships between Rubygems, Bundler, and RVM 【发布时间】:2011-05-20 16:26:37 【问题描述】:按照当前的最佳做法,这些做法的适当角色是什么?
根据我对 Bundler 和 RVM 的有限了解,它们似乎——就像 Rubygems——有自己的 gem 安装位置。另外,对于每一个,都可以选择使用sudo
安装到系统路径或您的主目录。然后可以使用 Bundler(在适用的情况下,例如使用 Rails)来供应 gem。
所以在我看来,现在至少有七个地方可以安装 gems:
Rubygems 系统路径 Rubygems 用户路径 RVM 系统路径 RVM 用户路径 捆绑器系统路径 捆绑器用户路径 供应商(每个应用)那么,管理这一切的最佳方法是什么?我们是否使用所有三个(Rubygems、Bundler、RVM)并告诉他们都将 gem 安装到同一个地方?我们是一直使用sudo
,有时还是从不使用?我们是否应该在生产和开发机器上使用不同的策略?
在相关说明中,Bundler 和 RVM 是 Rubygems 的包装器,它们是它的替代品,还是完全正交?
【问题讨论】:
【参考方案1】:来自 Bundler 的website:
Bundler 可以轻松确保您的应用程序具有启动和运行所需的依赖项而不会出现错误。
这意味着其他开发人员或您在另一台机器上通过运行bundle install
准备进一步开发或使用它是微不足道的,并且您拥有启动和运行所需的一切。
RVM 用于在同一台机器上管理多个版本的 Ruby,并在它们之间切换。 Gemsets 是 RVM 提供的一项强大功能,可将一个应用程序/库的 gem 与系统的其余部分隔离开来。
当同时使用 RVM 和 Bundler 时,RVM 会告诉 Bundler gem 应该去哪里,然后 Bundler 将它们安装到 RVM 文件夹中。
两者(关于 RVM 中的 gem)都使用并依赖于 Rubygems,因此它们最接近包装器。
就我个人而言,我的所有项目都使用 Bundler 和 RVM。没有 gemsets,只有 Bundler 来解决和修复问题,它不会失败。无需 sudo
即可安装 gems,并在 RVM 定义的地方结束。我系统上的默认 Ruby 安装被单独保留,Rubygems 系统/用户路径没有安装任何东西
【讨论】:
你的回答很清楚。但是当没有安装 rvm 时,捆绑器会在哪里安装 gems。 安装rvm时,rvm如何告诉bundler,在哪里安装gem? 如果没有 RVM,bundler 会将 gem 安装到 gem 的默认系统位置(例如 /usr/lib/ruby/gems,这是我的 Gentoo-box 上的默认位置)。 RVM 通过提供 GEM_HOME 环境变量告诉 Bundler 安装位置。 我是 *** 中的最爱,有最喜欢的关卡,所以我可以把这个问题排在第 1 位。【参考方案2】:我现在的做法(虽然还在尝试)是这样的:
使用 RVM 设置 ruby 版本和用于应用程序的 gemset。我在 app 目录的根目录中使用 .rvmrc 文件来确保始终使用正确的 ruby 和 gemset。
Bundler 是使用 gem 安装的,在给定的 gemset 中没有 sudo。
应用程序所需的任何 gem 都添加到应用程序 Gemfile 中,并使用 Bundler 进行安装。我没有为此使用 sudo。
这样,我使用 Bundler 跟踪每个应用程序的依赖关系,并使用 RVM 将每个应用程序的 gem 相互隔离。实际上,工作非常顺利。
我还没有在我的部署服务器上安装 RVM,我只是使用 Bundler 来确保处理每个应用程序的依赖关系。我可能也会在那里安装 RVM,但必须先弄清楚它是如何与乘客打球的。
至于您的最后一个问题,Bundler 是 gem 的包装器,RVM 只是操纵安装 gem 的 gempath。它似乎很聪明,可以从同一个地方拾取 gem,所以我不需要重新编译任何已经安装在其他 gemset 中的 gem。
在开始使用 RVM 后,我已经停止使用 sudo 来安装 gems。真的没有理由只将它们安装在 rvm 用户路径中。如果您在同一台机器(如测试服务器或类似设备)上有更多开发人员,我不确定最佳做法。
【讨论】:
"使用 RVM 设置 ruby 版本和用于应用程序的 gemset"--这个 gemset 如何与 Gemfile 和 Bundler 交互? gemset 一开始是空的,与系统的其余部分完全分离。 Bundler 和 Gemfile 仍然做同样的事情,但安装到 gemset 而不是全局安装。 谢谢!当您在某个应用程序上工作时,您会切换到正确的 gemset,还是 Bundler 可以为您处理? Gemsets 仅适用于 RVM。 Bundler 不知道有什么不同。您可以手动切换,也可以添加一个 .rvmrc 文件 (docs) 来处理它。你应该阅读the documentation for Gemsets了解更多详情以上是关于Rubygems、Bundler 和 RVM 之间的关系的主要内容,如果未能解决你的问题,请参考以下文章
bundler vs RVM vs gems vs RubyGems vs gemsets vs system ruby [关闭]
使用 Bundler 时,为啥要关心 RVM 的 Gemset 功能?