在上一章中,我们讨论了 RubyGems 以及它们如何与 Ruby 和本地文件系统交互。在那次讨论中,我们随便提到了如何使用 ruby​​ 版本管理器。但是,我们没有详细说明。具体来说,我们没有讨论 ruby​​ 版本管理器是什么,也没有讨论它们为编写和使用 Ruby 程序的开发人员提供什么服务。在本章中,我们将讨论这些主题。

什么是 Ruby 版本管理器?

Ruby 版本管理器是可让你安装、管理和使用多个 Ruby 版本的程序。如果你刚刚开始使用 Ruby,你可能想知道为什么可能需要使用多个版本的 Ruby。

有可能,你到目前为止编写的程序是 “版本不可知的”;也就是说,它们不依赖于依赖于任何特定 ruby​​ 版本的 Ruby 特性。如果你确实依赖这些功能,那么你使用的所有功能都可以在你使用的任何 Ruby 版本中运行良好,因此你甚至不会意识到你正在使用特定于版本的功能。

然而,情况并非总是如此:Ruby 是一种不断发展的语言,每个新版本都会添加、修改和删除特性。最终,你将编写或使用需要不同 Ruby 版本的 Ruby 程序,这时需要一个 Ruby 版本管理器。

使用 Ruby 版本管理器的另一个原因是在处理多个应用程序时。软件应用程序倾向于在特定的 Ruby 版本上进行标准化,以保证开发人员不会使用不受支持的语言功能。例如,你可能会被要求帮助处理已在 Ruby 版本 2.1 上标准化的现有项目,但你当前的本地 Ruby 版本是 2.3,你需要在当前项目上工作。在这种情况下,你将需要 Ruby 版本管理器的帮助,以帮助你在不同项目之间切换时管理和在不同 Ruby 之间移动。

我应该使用哪个 Ruby 版本管理器?

有两个常用的主要 ruby​​ 版本管理器:RVM 和 rbenv。(还有其他的,比如 chruby,但它们的使用范围要小得多。)他们对使用多个 Ruby 版本的问题采取了不同的方法,但结果是一样的:你可以轻松地在同一个 Ruby 版本上使用多个版本的 Ruby。

但是,你应该使用哪个版本管理器?这在一定程度上取决于你自己的偏好和需求,但大多数人可以选择一个并开始使用它。在功能上,这两个系统执行大多数开发人员需要的所有任务。在大多数情况下,几乎没有什么特征值得推荐。

如果你不确定,那就选择 rbenv。

在 Mac 上使用 Rbenv。如果你安装了 Homebrew,安装 Rbenv 的最简单方法是使用 brew install rbenv 命令。

有关如何安装和使用 RVM 或 rbenv 的信息,请参阅 RVM 和 Rbenv 网站上的文档。在本书中,我们关注它们如何与你的系统交互。

rbenv 的工作原理

rbenv 的核心是一组与 RVM 核心目录非常相似的目录。它存储和使用这些目录中的 ruby、相关工具和 gem。每个版本的 Ruby 都有位于 versions 目录中的子目录。如果你需要 Ruby 2.7.4,rbenv 使用 2.7.4 目录中的文件;如果你需要 Ruby 2.7.1,它会从 2.7.1 目录中获取文件。请注意,Gem 版本号可能不同:在这种情况下,Ruby 2.7.1 使用 Rubocop 0.43.1,而 Ruby 2.7.4 使用 Rubocop 0.45.0。

作为 rbenv 或 rvm 的用户,你会觉得这两个工具非常相似,只是在语法上只有很小的区别。然而,在幕后,rbenv 管理 Ruby 的方式与 RVM 的管理方式有很大不同。rbenv 使用一组称为 shims 的小脚本。这些脚本与各种 ruby​​ 和 Gem 程序具有相同的名称。它们位于 shims 主 rbenv 安装目录的子目录中。有效 rbenv 装置包括 shims 在目录 PATH; rbenv 将它放在任何其他包含 ruby​​ 或任何相关程序的目录之前;这确保系统 shims 首先搜索目录。这样,当你运行其中一个 ruby​​ 命令或 Gems 时,系统会执行正确的 shim 脚本。shim 脚本依次执行 rbenv exec PROGRAM; 这个命令决定它应该使用什么版本的 Ruby,并从 Ruby 版本特定的目录中执行适当的程序,例如,/usr/local/rbenv/versions/2.7.4/bin.

这一切听起来很复杂,确实如此。然而,在实践中,它大多是不可见的。如果你想 rubocop 从 Ruby 2.7.1 目录运行,你告诉 rbenv 使用 Ruby 2.7.1,然后运行 rubocop 命令。神奇的是,系统找到了 rubocopshim,shim 运行 rbenv exec rubocop,然后运行 ​​Ruby 2.7.1 版本的 rubocop.

安装 ruby

你应该使用 rbenv 做的第一件事是安装你需要的 Ruby 版本。这很容易做到,并且只需对任何特定版本的 Ruby 执行一次。

假设你即将开始一个需要 Ruby 2.7.1 的项目。你首先需要检查你是否已经安装了 Ruby 2.7.1。为此,请运行:

$ rbenv versions

此命令显示你当前安装了 Ruby 版本 2.1.5 和 2.7.4,并且版本 2.7.4 是当前选择的 Ruby 版本。由于列表未显示版本 2.7.1,我们需要安装它。但是,与 RVM 不同的是,rbenv 默认不提供安装新 Ruby 的方法。幸运的是,有一个简单的解决方法:只需安装 ruby-buildrbenv 插件。如果你在 Mac 上使用 Homebrew 版本的 Ruby,只需运行:

$ brew install ruby-build

否则,请按照 ruby-build GitHub 页面上的安装说明进行操作。安装 ruby-build 插件后,你可以使用以下命令安装 Ruby 2.7.1:

$ rbenv install 2.7.1

镶嵌本地 ruby

现在你已经安装了 Ruby 2.7.1,你如何告诉 rbenv 使用它?有几种方法,每种方法都在 rbenv 的 GitHub README 文件中进行了描述。最简单的方法是首先运行:

$ rbenv global 2.7.4

这会将 Ruby 的默认版本设置为 2.7.4。从那里,你只需要担心需要不同版本的程序。例如,假设你~/src/magic 目录中的程序需要 Ruby 2.0.0。要安排它,请运行:

$ cd ~/src/magic
$ rbenv local 2.0.0

这将.ruby-version 在~/src/magic 目录中创建一个文件;当你运行存储在此目录中的任何基于 Ruby 的程序时,rbenv 检查该.ruby-version 文件,并为该程序使用该版本的 Ruby。如果没有.ruby-version 文件,则 rbenv 开始搜索替代.ruby-version 文件,如果仍然找不到,则使用全局版本的 Ruby。

请注意,此.ruby-version 文件与.ruby-versionRVM 使用的文件相同:相同的名称、相同的内容、相同的功能和相同的搜索顺序。

有关此过程的更多信息,请参阅 rbenv 文档。

我的 Ruby、gem 和应用程序现在在哪里?

rbenv 在安装时创建一个目录,称为 rbenv 根目录;它还在此目录中安装所有 rbenv 相关文件,包括它管理的所有 Ruby 和 Gems。要确定 rbenv 根目录的位置,请运行:

$ rbenv root

在作者的系统上,这显示:

/home/peng/.rbenv

你可能还记得,你可以使用它 gem env 来了解有关 Ruby 和 Gem 配置的一些有趣细节,尤其是它使用的目录。安装 rbenv 后,gem env 仍然有效,并向你显示当前在 rbenv 中活动的 Ruby 和 Gem 的详细信息;你会发现其中许多文件存储在 rbenv 根目录下。

当事情出错时

与 RVM 相比,rbenv 使用一种保守的方法来执行其任务:它不依赖于对你的环境或系统命令进行动态更改。相反,它会对你的 进行一次小的、一次性的更改 PATH,并使你的系统完全按照设计运行。这是 rbenv 的真正优势,也是许多开发人员更喜欢它而不是 RVM 的主要原因;出错的可能性较小。没有那么多活动部件需要担心。

因此,运行 rbenv 后,它的问题就很少了。可能发生的最坏情况是你可能不小心删除或移动了它需要的一些文件,你通常可以从备份中修复这些文件(你有备份,对吗?)。rbenv 最可能的问题是你对正在运行的 Ruby 版本感到困惑,或者你使用错误的 gem 命令来安装或更新某些 Gems。在尝试诊断 rbenv 问题时,首先确保你使用的是正确的 Ruby 版本——这样的问题更容易看到——然后检查 Gem 版本控制问题。

以下是一些有用的故障排除命令:

rbenv version

显示当前活动的 Ruby 版本,以及如何 rbenv 确定版本的简短说明。如果你看到显示的版本错误并且不明白为什么,请参阅文档。“选择 Ruby 版本” 一节特别重要。

echo $PATH

确认你的 shims 目录在 PATH 中。具体来说,验证它是否在你的路径中出现。例如,如果/usr/bin 出现/usr/local/rbenv/shims 在你的 PATH 之前,你的系统可能会加载 Ruby 的系统版本,而不是由 rbenv 管理的系统版本。

rbenv which COMMAND

显示由命令指定的命令的磁盘位置(例如 ruby,irb,rubocop)

rbenv rehash

重建 shims 目录。如果你无法执行某些命令或 rbenv 似乎没有运行正确的命令,请尝试使用此命令。

rbenv root

显示 rbenv 根目录的路径。

rbenv shims

显示所有当前垫片的列表。

gem env

显示有关 RubyGems 系统的配置信息。

插件

有十几个插件可以扩展 rbenv 提供的功能。随着你对 rbenv 的使用扩展,不要忘记检查它们。几乎每个人都特别感兴趣的是 ruby-build;这会将 install 命令添加到命令中,rbenv 因此你可以直接使用 rbenv 安装 rubies;这比手动配置和安装每个版本更容易。

总结

Ruby 版本管理器让你可以管理 Ruby 的多个版本、irb 与每个版本关联的实用程序(例如)以及为每个 Ruby 安装的 RubyGems。使用版本管理器,你可以安装和卸载 ruby​​ 版本和 gem,并使用特定程序和环境运行特定版本的 ruby​​。

两个主要的版本管理器,RVM 和 rbenv,在功能上是相似的,对于大多数开发人员来说,两者几乎没有区别。默认情况下,RVM 具有更多功能,但 rbenv 插件提供了 rbenv 的基本安装未提供的大部分功能。RVM 通过动态管理你的环境来工作,主要是通过修改你的 PATH 变量并将内置 cd 命令替换为 RVM 感知的 shell 函数;rbenv 只需修改你 PATH 和其他一些环境变量即可工作。

正如我们所见,Ruby 程序通常需要特定版本的 Ruby,以及它使用的特定版本的 Gems。Ruby 版本管理器负责处理由这些不同需求引起的大部分问题,但有时你会发现它们还不够。例如,你可能需要将 Ruby 2.7.1 用于两个不同的项目,而不是默认的 2.7.4,但你可能还需要不同版本的 Rails Gem,例如一个项目使用 4.2.7,而一个项目使用 5.0.0 版本。另一个。虽然 RVM 和 rbenv(借助插件)都可以处理这些需求,但更简单、更常见的方法是使用名为 Bundler 的 RubyGem。我们将在下一章讨论 Bundler。

110 Ruby 版本管理器【Rails后端开发训练营】相关推荐

  1. Web后端开发训练营结课心得

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.SpringBoot简介 1.1 什么是SpringBoot 1.2 SpringBoot的主要特点 二.Spri ...

  2. Ruby on Rails社区网站开发

    Ruby on Rails社区网站开发 "这是一部杰作!有它在手,足以开发出一个真正的社区网站.书中采用了模块化的方法,实例可以非常容易地复用,比如在现有网站中添加社区网络功能." ...

  3. 挑战360无死角讲解Linux内核 进程管理,调度器的5种实现丨C++后端开发丨C/C++Linux服务器开发丨内核开发丨网络编程

    挑战360无死角讲解 进程管理,调度器的5种实现 1. 8500行 CFS是什么 2. RT调度器使用场景 3. IDLE/Dealine调度器 视频讲解如下,点击观看: 挑战360无死角讲解Linu ...

  4. 前端和后端开发人员比例_前端开发人员vs后端开发人员–实践中的定义和含义

    前端和后端开发人员比例 Websites and applications are complex! Buttons and images are just the tip of the iceber ...

  5. 24步成为后端开发工程师

    今天的网站开发已经大不同以往,有很多的东西会对进入此领域的人造成困惑,这就是我们写这系列文章的原因--给大家指导如何在开发过程中胜任特定的角色. 大约1周以前,我们发布了一篇名为"现代前端开 ...

  6. IT:后端进阶技术路线图(初级→中级→高级)、后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介、技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略

    IT:后端进阶技术路线图(初级→中级→高级).后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介.技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略 目录 后端 ...

  7. mac下后端开发常用软件

    简介 换了台macbook,接下来分享下我在mac里安装的常用软件,也方便自己以后重装 Intellij IDEA Java开发神器,开发效率高,功能非常强大,社区版阉割了太多功能,满足不了开发需求, ...

  8. 流利说-后端开发工程师

    流利说 后端开发工程师/专家 • 计算机或相关专业本科以上学历,两年以上工作经验(如果你足够牛,可以尝试挑战这一条) • 以上Ruby或Java相关的后端开发经验,比如Rails.Sinatra等 • ...

  9. 搭建rtmp直播流服务之4:videojs和ckPlayer开源播放器二次开发(播放rtmp、hls直播流及普通视频)...

    前面几章讲解了使用 nginx-rtmp搭建直播流媒体服务器; ffmpeg推流到nginx-rtmp服务器; java通过命令行调用ffmpeg实现推流服务; 从数据源获取,到使用ffmpeg推流, ...

  10. 逆风而行!从考研失败到收获到自己满意的后端开发Offer,分享一下自己的经历!

    大家好,我是Guide哥,这篇文章是一位读者的投稿.这篇文章分享了他从确定Java后端方向 -> 考研 -> 考研失败->准备春招 -> 收货自己满意的offer 的心路历程. ...

最新文章

  1. 6.:first-child子元素过滤选择器
  2. HTML Encode 编码在线转换工具
  3. linux $变量含义($0,$1,$2,$#,$@) ----linux 基础
  4. python:数组/列表(remove()函数、append()函数、sort()函数、reverse()函数)
  5. C标准库和glibc(C运行库)的关系
  6. 绑定线程到特定CPU处理器
  7. ajax 调用后台的方法
  8. android oat如何提取dex文件字节码,Android: 使用oatdump反编译oat文件
  9. getallheaders函数在服务器报500错误_C语言服务器编程必备常识
  10. WPF中Binding的验证
  11. 哪种修复redis未授权访问漏洞的方法是相对不安全的_redis漏洞复现
  12. 全网目前最全python例子(附源码)
  13. java poi写doc文件_如何使用POI hwpfdocument在java中的.doc文件中编写大量文本
  14. SQL server 2008 全代码
  15. 涨粉29w,获赞超百万,小红书近期创作趋势是什么?
  16. ros入门--中科院软件所ros学习笔记
  17. win10 状态栏图标变成白色方块
  18. 勤哲Excel服务器分类问题解答
  19. ftl页面中html飘红,eclipse下不能编译.ftl文件,会报错的解决方法
  20. mysql堆表和索引组织_从堆表(Heap Table)到索引组织表

热门文章

  1. 基于facades数据集的图像成任务,完成各种GAN的对比实验
  2. 如何成为一名IC验证工程师——IC修真院直播
  3. word自动编号与文字间距太大怎么办
  4. IDEA常用插件、设置、注释
  5. 国仁猫哥:视频号企业运营指南教科书;不可错失的红利。
  6. JS的unshift()和shift()
  7. 问题描述:vcenter上数据存储的事件中有大量的警告,还有偶尔的报错,存储设备naa...的路径冗余已降级,路径。。已关闭,受影响的数据存储 与存储设备。。。连接丢失,路径。。已断开,受影响的存储
  8. 我原以为我不会伤心......
  9. 从零开发全网搜索引擎
  10. 安装失败:user ‘system‘ has previously initiated an install for product‘‘