rbenv(ruby管理工具)的工作原理介绍

1.工作原理

rbenv使用可以被注入到您的 PATH shim可执行文件来拦截Ruby命令,确定您的应用程序已指定了哪个Ruby版本,并将您的命令传递给正确的Ruby安装。

2.PATH环境变量

当您运行诸如rubyrake命令时,您的操作系统将通过一个目录列表搜索以查找具有该名称的可执行文件。此目录列表位于名为PATH的环境变量中,列表中的每个目录均由冒号分隔:

/usr/local/bin:/usr/bin:/bin

在目录PATH中搜索由左到右,所以在该列表的开头的目录匹配的可执行文件的优先级高于结尾的另外一个。在这个例子中,该 /usr/local/bin目录将被搜索的第一个,然后/usr/bin,然后/bin

3.Shims解释

shims中文意思是垫片的意思,比较形象的解释就是在某个地方插入个垫片,这个垫片起到拦截的作用,然后把您的命令转到对应的地方。

rbenv通过在您的 PATH 前面插入 shims 目录的原理来工作:

~/.rbenv/shims:/usr/local/bin:/usr/bin:/bin

通过这个被称为 rehashing 的过程,rbenv通过在 PATH 中的 shims 以匹配每一个Ruby命令到达每个已安装的Ruby版本对应的irbgemrakerailsruby等命令。

Shim是轻量级的可执行文件,它们仅将您的命令传递给rbenv。因此,在安装了rbenv的情况下,比如运行rake时,您的操作系统将执行以下操作:

  • 在您的PATH中搜索名为rake的可执行文件
  • 在您的PATH开头查找名为rake的rbenv shim
  • 运行名为rake的shim,shim将命令传递给rbenv

4.切换Ruby版本

执行shim程序时,rbenv通过从以下来源按以下顺序读取来确定要使用的Ruby版本:

  1. RBENV_VERSION环境变量:您可以使用rbenv shell命令在当前的Shell会话中设置此环境变量。
  2. .ruby-version通过搜索正在执行的脚本的目录及其每个父目录,直至到达文件系统的根目录,找到了第一个.ruby-version文件。
  3. 通过搜索当前工作目录和它的每个父目录,直至达到你的文件系统的根目录,找到第一个.ruby-version文件。您可以在当前工作目录中使用rbenv local命令修改文件.ruby-version
  4. 全局~/.rbenv/version文件。您可以使用rbenv global命令修改此文件。如果不存在全局版本文件,则rbenv假定您要使用 system 版本Ruby,如果rbenv不在您的路径中,则将运行任何版本。

5.Ruby安装路径及目录

一旦rbenv确定了您的应用程序指定了哪个Ruby版本,它将把命令传递给相应的Ruby安装。

每个Ruby版本都安装在自己的目录下 ~/.rbenv/versions。例如,您可能已安装以下版本:

  • ~/.rbenv/versions/1.8.7-p371/
  • ~/.rbenv/versions/1.9.3-p327/
  • ~/.rbenv/versions/jruby-1.7.1/

rbenv的ruby版本名称与在 ~/.rbenv/versions下的目录名称同名。

6.环境变量

名称默认描述
RBENV_VERSION指定要使用的Ruby版本。
另见rbenv shell
RBENV_ROOT~/.rbenv定义rbenv和Ruby版本以及shims所在的目录。
另见rbenv root
RBENV_DEBUG输出调试信息。
也作为:rbenv --debug <subcommand>
RBENV_HOOK_PATH参见维基用冒号分隔的路径列表搜索rbenv钩子。
RBENV_DIR$PWD在此目录下搜索.ruby-version文件。

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/experience/rubyops/1795.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注