RVM 中将东西安装到@global gemset 中有什么优点和缺点?
假设我想在同一台服务器上安装不同版本的 rails。 然后,我希望能够在同一台服务器上安装多个 ruby 应用程序,同时减少文件重复以节省磁盘空间。 但是,我仍然想避免依赖问题、宝石冲突问题和其他问题。
我们还假设每个应用程序都有它需要的额外 gem,我只想要它的本地项目 gemset 。
我会过得更好吗:
- 将导轨 3 和轨道 2 宝石安装到
@global
宝石组中- 。并使用项目本地宝石镶嵌作为他们的宝石...
- 将 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...
-
- 完全是别的东西...
注意:我写了整个响应,假设您正在使用 Bundler 来管理您的 gem 依赖项。我知道有些人没有,而且您在问题中没有提到 Bundler。如果您没有使用Bundler,我会指出这可能是节省磁盘空间的最佳方法(仅当您bundle install --system
时!如果您使用导出的 gemset 来管理依赖项,我认为您的方案听起来很合理,但我没有这方面的经验。
带有捆绑器的 Rails 3 和 Rails 2 都将适当地设置其加载路径,以便它们不会加载不在Gemfile.lock
中的任何 gem(或任何 gem 的任何版本)。我实际上没有任何方法可以在服务器上遇到"gem 依赖问题"。请务必在修改Gemfile
时在开发计算机上运行bundle install
,并将Gemfile.lock
签入源代码管理,如 Bundler 主页中所述。
早在 1 月份,我就花了一些时间深入研究宝石镶嵌的用例。我发现为每个项目使用单独的宝石集的原因是:
- 您的 shell 环境与应用程序环境相同(脚本无需
bundle exec
即可正常运行)。 - 通过导航到 gemset 安装目录,您可以轻松浏览和 grep 浏览所有依赖项的源代码。
- 根据RVM的作者的说法,它可以防止一些报告的"heisenbugs"。我经历过这样的事情,其中 gem 可执行文件不可用,
bundle exec
似乎没有帮助。
我认为这些好处中的任何一个在服务器上都不是很有吸引力,所以如果您的目标是节省磁盘空间,我不确定为什么要使用 gemset。
实际上,我在服务器上使用 rvm 的唯一原因是因为它是一种从源代码构建 ruby 的便捷方式(我们需要一个在本机包管理器中不可用的版本)。