首页 文章

Rubygems,Bundler和RVM之间的关系

提问于
浏览
29

按照目前的最佳做法,每种方法的作用是什么?

基于我对Bundler和RVM的有限理解,似乎他们 - 像Rubygems - 有自己的宝石安装位置 . 另外,对于每一个,都可以选择使用 sudo 或您的主目录安装到系统路径 . 然后有能力使用Bundler供应宝石(适用时,例如使用Rails) .

所以在我看来现在至少有七个地方可以安装宝石:

  • Rubygems系统路径

  • Rubygems用户路径

  • RVM系统路径

  • RVM用户路径

  • Bundler系统路径

  • Bundler用户路径

  • 供应商(每个应用程序)

那么,管理这一切的最佳方法是什么?我们是否使用全部三个(Rubygems,Bundler,RVM)并告诉他们所有人将宝石安装到同一个地方?我们一直在使用 sudo ,有时候还是从不?我们是否应该在 生产环境 和开发机器上使用不同的策略?

在相关的说明中,围绕Rubygems的Bundler和RVM包装器,它们是它们的替代品,还是它们完全正交?

2 回答

  • 32

    来自Bundler的website

    Bundler可以轻松确保您的应用程序具有启动和运行所需的依赖项,而不会出现错误 .

    这意味着,对于其他开发人员或您在另一台计算机上,通过运行 bundle install 准备好进一步开发或使用它,并且您拥有启动和运行所需的一切,这是微不足道的 .

    RVM用于在同一台机器上管理多个版本的Ruby,并在它们之间进行切换 . Gemsets是RVM提供的一项强大功能,可将一个应用程序/库的gem与系统的其余部分隔离开来 .

    当一起使用RVM和Bundler时,RVM告诉Bundler gem应该去哪里,Bundler将它们安装到RVM文件夹中 .

    两者(关于RVM中的gems)使用并依赖于Rubygems,因此它们最接近包装器 .

    我个人使用Bundler和RVM来完成我的所有项目 . 没有gemsets,只有Bundler来解决和修复问题,它确实没有失败 . 安装gems是在没有 sudo 的情况下完成的,最终会在RVM定义的地方完成 . 我的系统上的默认Ruby安装是独立的,并且没有任何内容安装到Rubygems系统/用户路径

  • 3

    我现在这样做的方式(虽然仍在尝试一下)是这样的:

    • 使用RVM设置ruby版本和用于应用程序的gemset . 我在app目录的根目录中使用.rvmrc文件,以确保始终使用正确的ruby和gemset .

    • Bundler是在给定的gemset中使用没有sudo的gem安装的 .

    • 应用程序所需的任何宝石都会添加到应用程序Gemfile中并使用Bundler进行安装 . 我没有使用sudo .

    这样我就可以使用Bundler跟踪每个应用程序的依赖关系,并使用RVM将每个应用程序的宝石相互隔离 . 实际上工作非常顺利 .

    我还没有在我的部署服务器上安装RVM,在那里我只使用Bundler来确保处理每个应用程序的依赖 . 我可能也会在那里安装RVM,但是必须先弄清楚如何与乘客一起玩 .

    至于你的上一个问题,Bundler是一个围绕gem的包装器,RVM只是操纵安装了gem的gempath . 它似乎很聪明,它从同一个地方获取宝石,所以我不需要重新编译任何已经安装在其他宝石集中的宝石 .

    在开始使用RVM之后,我已经停止使用sudo来安装gem . 没有理由只在rvm用户路径中安装它们 . 如果你在同一台机器上有更多的开发人员,比如测试服务器或类似的东西,我不确定最佳实践 .

相关问题