我对RVM和rbenv的实际工作方式很感兴趣.

显然,它们在不同版本的Ruby和Gemset之间交换,但这是如何实现的呢?我本以为他们只是在更新符号链接,但在深入研究代码(我必须承认我对Bash的了解是肤浅的)之后,他们似乎做的不止这些.

推荐答案

简短说明:rbenv的工作原理是连接到您环境的PATH.这个概念很简单,但魔鬼在于细节;下面是完整的勺子.

首先,rbenv为所有安装的Ruby版本中的所有命令(rubyirbrakegem等)创建shims.这个过程叫做rehashing.每次安装新版本的Ruby或安装提供命令的gem时,请运行rbenv rehash以确保所有新命令都已填充.

这些垫片位于一个目录中(默认为~/.rbenv/shims).要使用rbenv,只需将Shimmes目录添加到PATH的前面:

export PATH="$HOME/.rbenv/shims:$PATH"

然后,每当您从命令行运行ruby,或运行shebang读取#!/usr/bin/env ruby的脚本时,您的操作系统将首先找到~/.rbenv/shims/ruby并运行它,而不是您可能安装的任何其他ruby个可执行文件.

每个垫片都是一个小的Bash脚本,依次运行rbenv exec次.因此,在您的路径中使用rbenv时,irb相当于rbenv exec irbruby -e "puts 42"相当于rbenv exec ruby -e "puts 42".

rbenv exec命令确定您想要使用哪个版本的Ruby,然后为该版本运行相应的命令.以下是方法:

  1. 如果设置了RBENV_VERSION环境变量,其值将决定要使用的Ruby版本.
  2. 如果当前工作目录有一个.rbenv-version文件,其内容将用于设置RBENV_VERSION环境变量.
  3. 如果当前目录中没有.rbenv-version个文件,rbenv会在每个父目录中搜索.rbenv-version个文件,直到它到达文件系统的根目录.如果找到一个,它的内容将用于设置RBENV_VERSION环境变量.
  4. 如果仍然没有设置RBENV_VERSION,rbenv将try 使用~/.rbenv/version文件的内容设置它.
  5. 如果任何地方都没有指定版本,rbenv会假设您想要使用"系统"Ruby,即如果rbenv不在您的路径中,将运行任何版本.

(您可以使用rbenv local命令设置特定于项目的Ruby版本,该命令在当前目录中创建.rbenv-version文件.同样,rbenv global命令修改~/.rbenv/version文件.)

rbenv配备了一个RBENV_VERSION环境变量,将~/.rbenv/versions/$RBENV_VERSION/bin添加到PATH的前面,然后执行传递给rbenv exec的命令和参数.瞧!

要彻底了解引擎盖下到底发生了什么,请try 设置RBENV_DEBUG=1并运行Ruby命令.rbenv运行的每个Bash命令都将写入终端.


现在,rbenv只关心版本切换,但一个蓬勃发展的插件生态系统将帮助您完成从installing Rubysetting up your environmentmanaging "gemsets"甚至automating bundle exec的所有工作.

我不太确定IRC支持与切换Ruby版本有什么关系,rbenv的设计非常简单易懂,不需要支持.但如果你需要帮助,问题追踪器和Twitter只需点击几下.

Disclosure: I am the author of rbenv, ruby-build, and rbenv-vars.

Ruby-on-rails相关问答推荐

使用ActiveSupport::TimeWithZone将UTC转换为用户定义的时区

在 Rails 中进行 Http 基本身份验证

设计 token_authenticable 已弃用,有什么替代方案?

来自控制台的 ActionCable.server.broadcast

Rails - 如何从 http://example.com 重定向到 https://www.example.com

Factory Girl + Mongoid 在fixture 中嵌入文档

如何在 Ruby 字符串中返回最后一个斜杠(/)之后的所有内容

如果 URL 不存在,请将 http(s) 添加到 URL?

如何从 Rails 路由中删除控制器名称?

Rails 3 中的动态错误页面

如何使用失败try 次数使设计可锁定

设计和强大的参数

DateTime.now 还是 Time.now?

什么是Ruby 用于 BESIDES 轨道?

Rails 错误:无法批量分配受保护的属性

表单中的第一个参数不能包含 nil 或为空 - Rails 4

link_to 将参数与 url 一起发送并在目标页面上抓取它们

快速添加链接[:notice]

为什么 RSpec 在 Rails 下这么慢?

如何拆分长行的 Ruby