Ruby on Rails - 在 RVM 中将东西安装到@global gemset 中的优点和缺点是什么?



RVM 中将东西安装到@global gemset 中有什么优点和缺点?


假设我想在同一台服务器上安装不同版本的 rails。 然后,我希望能够在同一台服务器上安装多个 ruby 应用程序,同时减少文件重复以节省磁盘空间。 但是,我仍然想避免依赖问题、宝石冲突问题和其他问题。

我们还假设每个应用程序都有它需要的额外 gem,我只想要它的本地项目 gemset 。

我会过得更好吗:

  1. 导轨 3轨道 2 宝石安装到@global宝石组中
    • 。并使用项目本地宝石镶嵌作为他们的宝石...
  2. Rails 3 安装到@rails3宝石组中,将 Rails 2 安装到@rails2 Gemset 中...然后为我需要的每个项目克隆?
    例如:
    • rvm use ree@rails3 && rvm gemset export rails3.gems
    • rvm use ree@rails2 && rvm gemset export rails2.gems
    • rvm use --create ree@project1-on-rails3 && rvm gemset import rails3.gems
      • 在此处安装更多项目本地 gem...
    • rvm use --create ree@project2-on-rails2 && rvm gemset import rails2.gems
      • 在此处安装更多项目本地 gem...
  3. 完全是别的东西...

注意:我写了整个响应,假设您正在使用 Bundler 来管理您的 gem 依赖项。我知道有些人没有,而且您在问题中没有提到 Bundler。如果您没有使用Bundler,我会指出这可能是节省磁盘空间的最佳方法(仅当您bundle install --system时!如果您使用导出的 gemset 来管理依赖项,我认为您的方案听起来很合理,但我没有这方面的经验。


带有捆绑器的 Rails 3 和 Rails 2 都将适当地设置其加载路径,以便它们不会加载不在Gemfile.lock中的任何 gem(或任何 gem 的任何版本)。我实际上没有任何方法可以在服务器上遇到"gem 依赖问题"。请务必在修改Gemfile时在开发计算机上运行bundle install,并将Gemfile.lock签入源代码管理,如 Bundler 主页中所述。

早在 1 月份,我就花了一些时间深入研究宝石镶嵌的用例。我发现为每个项目使用单独的宝石集的原因是:

  1. 您的 shell 环境与应用程序环境相同(脚本无需bundle exec即可正常运行)。
  2. 通过导航到 gemset 安装目录,您可以轻松浏览和 grep 浏览所有依赖项的源代码。
  3. 根据RVM的作者的说法,它可以防止一些报告的"heisenbugs"。我经历过这样的事情,其中 gem 可执行文件不可用,bundle exec似乎没有帮助。

我认为这些好处中的任何一个在服务器上都不是很有吸引力,所以如果您的目标是节省磁盘空间,我不确定为什么要使用 gemset。

实际上,我在服务器上使用 rvm 的唯一原因是因为它是一种从源代码构建 ruby 的便捷方式(我们需要一个在本机包管理器中不可用的版本)。

最新更新