bundler vs RVM vs gems vs RubyGems vs gemsets vs system ruby​​ [关闭]

Posted

技术标签:

【中文标题】bundler vs RVM vs gems vs RubyGems vs gemsets vs system ruby​​ [关闭]【英文标题】:bundler vs RVM vs gems vs RubyGems vs gemsets vs system ruby [closed] 【发布时间】:2013-03-13 05:55:09 【问题描述】:

我是 Ruby 的新手,并试图围绕以下概念进行思考:bundler vs RVM vs gems vs RubyGems vs gemsets vs system rub,我很困惑。

有人可以描述我应该如何在全新安装的最新版本 Ubuntu 上管理所有这些的“最佳实践”吗?我应该安装什么,我应该如何使用它?

我猜不推荐使用sudo apt-get install ruby,但我不确定。除了“所有其他 Ruby 的东西”之外,我还在我的系统上尝试了它。这只会增加我的困惑。我不是在谈论 Rails,而只是在谈论常规的 Ruby gem(例如 Vagrant、Chef、脚本)。

【问题讨论】:

【参考方案1】:

根据上一个答案,这涉及到很多内容,因此请考虑这是一个简短的介绍。

gems 是 Ruby 库的打包方式。它们之于 Ruby 就像 jar 之于 Java。在 gem 文件中,您可以找到 Ruby 代码(.rb 文件),还有测试,以及一个提供 gem 本身信息的特殊文件,例如它的名称、依赖项和版本 (gemspec)。任何 Ruby 项目都可以通过 Gemfile 定义它需要的 gem,只需要声明依赖项。 Rubygems 是包管理器的名称 - 用于安装包的工具(而 gem 是包本身)。 Rubygems 现在是 Ruby 的一部分。

Bundler 是让管理宝石变得可以忍受的原因。根据您的 Gemfile,使用 bundle install 对 bundler 的简单调用将下载并安装所有必需的 gem。使用标准 gem 命令,您必须使用gem install <gem_name> 手动安装它们。 Bundler 不是 Ruby 的一部分(它本身就是 packaged as a gem),但它是大多数应用程序的“事实上的标准”(你不会发现很多人不使用它,实际上也没有充分的理由不使用它)。

RVM 是一个工具,允许您在一台机器上安装多个版本的 Ruby,并在需要时在它们之间切换。这可用于安装 Ruby 1.8 和 1.9,甚至是“MRI”(Matz 的 Ruby,默认实现)和替代品(例如 JRuby 或 Rubinius)。请注意,RVM 并不孤单,例如,请参阅 rbenv。

RVM 中的 gemset 是一组特定于给定上下文(通常是项目)的 gem。例如,如果您正在开发不同的应用程序,每个应用程序都有自己的一组 gem,并且希望将它们分开,这将非常有用。

system Ruby 是,当使用 RVM 时,机器上安装的 Ruby 版本(即,不是通过 RVM)。

如果您刚刚开始,您可能会对 gems 和 bundler 感兴趣。您现在可以将 RVM 和 gemsets 放在一边。

【讨论】:

好答案,请您澄清一下:gems 和 RubyGems 有什么区别?在 gemspec 和 Gemfile 之间?此外,上面列出的哪些程序(例如捆绑程序)包含在“Ruby”中,哪些是单独的应用程序(我相信 RVM 是单独的)? gemset 只是 RVM 中的一个概念,还是核心 Ruby 中的一个概念(或其他东西,如另一个答案中提到的 rbenv)?如果 bundler 让管理 gems 变得更容易,那么 pre-bundler 的做法是什么? (即我知道,即使我永远不会那样做,你将如何在没有捆绑器的情况下管理宝石。)谢谢! 所以 Rubygems 是包管理器的名称,您可以使用“gem”命令调用它吗? bundler 是否也是 Ruby 本身的一部分,就像 Rubygems 一样,还是我需要以某种方式包含它? “如果你刚刚开始...... [你]你可以让 RVM......暂时搁置。”除非您在 OS X 上,并且您要安装和运行的 Ruby 项目依赖于比 OS 上预安装的版本更高的 Ruby 版本。然后你将需要 RVM。 这不是真的:“使用标准 gem 命令,您必须手动安装它们。”你绝对可以使用一个命令“gem install”在你的gemfile中安装所有gem【参考方案2】:

您在一个问题中询问的信息超出了 Stack Overflow 的范围。要涵盖这一切需要一本书。

在 Ubuntu 上,安装和删除 gem 到 Ruby 的“系统”版本很容易,所以习惯于通过sudo 安装和删除常规 gem。 (在 Mac OS 上,我会给出不同的建议,因为 Apple 捆绑 Ruby 供他们自己使用,因此混用它不是一个好主意。)您系统上的 Ruby 版本,尝试“rbenv”或“RVM”并在您的沙箱中安装一个或两个版本。

Linux 使得通过发行版添加/删除 Ruby 变得很容易,但我们仅限于发行版维护者打包的版本,因此我通常从源代码安装。但是,在为开发、测试和生产系统管理多个版本的 Ruby 时,这会很痛苦,这就是为什么发明 rbenv 和 RVM 的原因——它们处理肮脏的细节,让我们可以专注于编程。

我同时使用了rbenv 和RVM,并且在过去六个月左右一直在使用rbenv,效果很好。它比我喜欢的 RVM 简单。在任何一种情况下,它们都可以轻松安装不同的版本,并使用单独的 Gem 集。如果需要,您可以在不同的终端窗口中打开不同的 Ruby 版本,从而轻松测试兼容性。

调试时的第一条规则是一次更改一项,这对于学习编程或学习一门新语言是正确的。不要分心,保持简单。

【讨论】:

除了您的默认系统包管理器(例如 apt 或 apt-get)之外,切勿使用 sudo 任何包管理器。你将不可避免地搞砸你的系统。

以上是关于bundler vs RVM vs gems vs RubyGems vs gemsets vs system ruby​​ [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Rubygems、Bundler 和 RVM 混淆

Rubygems、Bundler 和 RVM 之间的关系

使用 Bundler 时,为啥要关心 RVM 的 Gemset 功能?

bundler 在哪里存储宝石?

Bundler 无法与 rbenv 一起使用,找不到 [gem]

通过 Bundler 安装 mysql2 gem 时出错