我对RVM和rbenv的实际工作方式很感兴趣.
显然,它们在不同版本的Ruby和Gemset之间交换,但这是如何实现的呢?我本以为他们只是在更新符号链接,但在深入研究代码(我必须承认我对Bash的了解是肤浅的)之后,他们似乎做的不止这些.
我对RVM和rbenv的实际工作方式很感兴趣.
显然,它们在不同版本的Ruby和Gemset之间交换,但这是如何实现的呢?我本以为他们只是在更新符号链接,但在深入研究代码(我必须承认我对Bash的了解是肤浅的)之后,他们似乎做的不止这些.
简短说明:rbenv的工作原理是连接到您环境的PATH
.这个概念很简单,但魔鬼在于细节;下面是完整的勺子.
首先,rbenv为所有安装的Ruby版本中的所有命令(ruby
、irb
、rake
、gem
等)创建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 irb
,ruby -e "puts 42"
相当于rbenv exec ruby -e "puts 42"
.
rbenv exec
命令确定您想要使用哪个版本的Ruby,然后为该版本运行相应的命令.以下是方法:
RBENV_VERSION
环境变量,其值将决定要使用的Ruby版本..rbenv-version
文件,其内容将用于设置RBENV_VERSION
环境变量..rbenv-version
个文件,rbenv会在每个父目录中搜索.rbenv-version
个文件,直到它到达文件系统的根目录.如果找到一个,它的内容将用于设置RBENV_VERSION
环境变量.RBENV_VERSION
,rbenv将try 使用~/.rbenv/version
文件的内容设置它.(您可以使用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 Ruby到setting up your environment、managing "gemsets"甚至automating bundle exec
的所有工作.
我不太确定IRC支持与切换Ruby版本有什么关系,rbenv的设计非常简单易懂,不需要支持.但如果你需要帮助,问题追踪器和Twitter只需点击几下.
Disclosure: I am the author of rbenv, ruby-build, and rbenv-vars.