Bundler、RVM、Gems、RubyGems、Gemsets和System Ruby之间的区别

119
我是新手,正在学习Ruby,并尝试理解以下概念:bundler、RVM、gems、RubyGems、gemsets和系统rub,但我感到困惑。
请问有人能描述一下在最新版本的Ubuntu上进行全新安装时如何管理所有这些内容的“最佳实践”?我应该安装什么,如何使用它们?
我猜测在系统中执行sudo apt-get install ruby可能不被推荐,但我不确定。我已经在我的系统上尝试了这个命令,并安装了“所有其他的Ruby东西”。这只让我更加困惑。我不是在谈论Rails,而是普通的Ruby gems(例如Vagrant、Chef和脚本)。
2个回答

227

根据之前的回答,需要涵盖的内容很多,所以请将其视为简短介绍。

Gems是打包Ruby库的方式。对于Ruby来说,它们就像Java中的jar文件一样。在一个gem文件中,你可以找到Ruby代码(.rb文件),还有测试和一个特殊的文件,提供有关该gem本身的信息,例如其名称、依赖关系和版本(gemspec)。任何Ruby项目都可以通过Gemfile声明所需的gem来定义这些gems。Rubygems是软件包管理器的名称,用于安装软件包(虽然gems本身是软件包)。 Rubygems现在是Ruby的一部分。

Bundler 是使管理 gems 变得可承受的工具。基于您的 Gemfile,使用bundle install进行简单调用即可下载并安装所有必需的 gem。使用标准 gem 命令,您将不得不手动安装每个 gem,使用 gem install <gem_name>。Bundler 不是 Ruby 的一部分(它本身作为一个 gem 打包),但它是大多数应用程序的“事实标准”(您不会找到许多人不使用它,实际上没有不使用它的好理由)。

RVM 是一款工具,允许您在计算机上安装多个 Ruby 版本,并在需要时进行切换。这可以用于安装Ruby 1.8和1.9,或者甚至是“MRI”(Matz的Ruby,即默认实现)和替代品(如JRuby或Rubinius)。请注意,RVM并不是这个领域的唯一选择,例如 rbenv

gemset 在 RVM 中是指特定上下文中的 gem 集合,通常是一个项目。如果您正在开发不同的应用程序,并且每个应用程序都有自己的 gem 集合,并想要保持它们分开,那么这将非常有用。

系统 Ruby 是使用 RVM 时安装在计算机上的 Ruby 版本(即非通过 RVM 安装的版本)。

如果您刚开始学习,那么 gems 和 bundler 就很有趣了。您可以暂时忽略 RVM 和 gemsets。


2
好的回答,能否请您澄清一下:gems和RubyGems之间有什么区别?gemspec和Gemfile之间又有什么区别?此外,这些程序中的哪些(例如bundler)包含在“Ruby”中,哪些是单独的应用程序(我认为RVM是单独的)? gemset只是RVM内部的一个概念,还是在核心Ruby中也有(或其他东西,如其他答案中提到的rbenv)?如果bundler使管理gems更容易,那么没有bundler的情况下,以前是如何管理gems的呢?(即使我永远不会以那种方式做,我也想知道。)谢谢! - user779159
那么Rubygems是包管理器的名称,您可以使用“gem”命令调用它?Bundler是否也是Ruby本身的一部分,就像Rubygems一样,还是我需要以某种方式包含它? - user779159
2
如果你刚开始学习编程... 你可以暂时不用考虑 RVM。除非你使用的是 OS X 操作系统,而且你想要安装和运行的 Ruby 项目需要比预装在操作系统中的 Ruby 版本更高的版本。那么你就需要使用 RVM。 - Hephaestus
这不是真的:“使用标准的gem命令,您必须手动安装它们中的每一个。” 您绝对可以使用单个命令“gem install”在您的gemfile中安装所有gems。 - Andy

2
你在一个问题中要求的信息超出了 Stack Overflow 的范围。要覆盖所有内容需要一本书。
在 Ubuntu 上,安装和删除 Ruby 的“系统”版本的 gem 很容易,因此请习惯于通过 sudo 安装和删除常规 gem。(在 Mac OS 上,我会给出不同的建议,因为 Apple 捆绑了 Ruby 供自己使用,而且搞乱它并不是一个好主意。)然后,当你了解了整个 gem 的概念,并且知道你想在系统上拥有多个 Ruby 版本时,请尝试 "rbenv" 或 "RVM" 并在你的沙盒中安装一两个版本。
Linux使得通过发行版添加/删除Ruby变得容易,但我们受限于发行版维护者打包的版本,因此我通常从源代码安装。但是,在管理多个用于开发、测试和生产系统的Ruby版本时,这会很麻烦,这就是为什么rbenvRVM被发明出来——它们处理肮脏的细节,让我们集中精力编程。
我使用过rbenvRVM,并且最近六个月一直在使用rbenv,效果不错。它比RVM简单,这一点我很喜欢。无论哪种情况,它们都可以轻松安装不同版本的Ruby,并带有独立的Gem集。如果你想要,在不同的终端窗口中可以打开不同的Ruby版本,这样很容易测试兼容性。
调试的第一条规则是逐个更改,这对于学习编程或学习新语言都是正确的。不要分心,保持简单。

1
永远不要对除您的默认系统软件包管理器(例如apt或apt-get)以外的任何软件包管理器使用sudo。否则,您将不可避免地破坏您的系统。 - image357

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接