RVM和rbenv实际上是如何工作的?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

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

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

提问于
用户回答回答于

简短的说明:rbenv的工作方式是连接到您的环境中PATH

首先,rbenv创建希姆斯对于所有命令(rubyirbrakegem(等等)跨所有安装版本的Ruby。这个过程称为重散,每次安装新版本的Ruby或安装提供命令的gem时,请运行rbenv rehash以确保任何新命令都会闪烁。

这些shims位于一个目录中(~/.rbenv/shims(默认情况下)。要使用rbenv,只需将shims目录添加到PATH:

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

你随时都会跑ruby在命令行中运行脚本,该脚本的shebang读取#!/usr/bin/env ruby,您的操作系统会发现~/.rbenv/shims/ruby首先运行它,而不是任何其他ruby您可能已经安装了可执行文件。

每个shm都是一个很小的bash脚本,然后运行。rbenv exec。所以当rbenv在你的道路上时,irb等于rbenv exec irb,和ruby -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尝试使用~/.rbenv/version档案。
  5. 如果在任何地方都没有指定版本,rbenv就假设想使用“system”Ruby--也就是说,如果rbenv不在您的路径中,则运行任何版本。

(您可以使用rbenv local命令,它创建一个.rbenv-version文件在当前目录中。类似地,rbenv global命令修改~/.rbenv/version(档案)

带着RBENV_VERSION环境变量,rbenv添加~/.rbenv/versions/$RBENV_VERSION/bin到你的前面PATH,然后执行传递给rbenv exec。瞧!

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

现在,rbenv只关心切换版本,但是一个繁荣的插件生态系统将帮助您完成所有的工作。

我不太清楚IRC支持与切换Ruby版本有什么关系,Rbenv的设计简单易懂,不需要支持。但是如果你需要帮助的话,问题追踪器和推特只需几下点击就可以了。

披露:我是rbenv,ruby-building和rbenv-vars的作者。

用户回答回答于

基本的区别是shell环境在何处更改:

  • RVM:更改Ruby时,它就会改变。
  • rbenv:当运行Ruby/gem可执行文件时,它会被更改。

另外,RVM的特点是,它所涉及的不仅仅是管理Rubies,它比任何其他工具都要多(除了RVM和rbenv之外,还有其他工具)

不要忘记在Freenode服务器上的“#RVM”通道中的IRC上获得的即时支持。

扫码关注云+社区