Ruby 等价于 viralenv?

有类似于 Python 实用程序 虚拟世界的东西吗?

基本上,它允许您将 Python 包安装到一个沙箱环境中,所以 easy_install django不会进入您的系统范围的站点包目录,而是进入由 viralenv 创建的目录。

例如:

$ virtualenv test
New python executable in test/bin/python
Installing setuptools...cd .........done.
$ cd test/
$ source bin/activate
(test)$ easy_install tvnamer
Searching for tvnamer
Best match: tvnamer 0.5.1
Processing tvnamer-0.5.1-py2.5.egg
Adding tvnamer 0.5.1 to easy-install.pth file
Installing tvnamer script to /Users/dbr/test/bin


Using /Library/Python/2.5/site-packages/tvnamer-0.5.1-py2.5.egg
Processing dependencies for tvnamer
Finished processing dependencies for tvnamer
(test)$ which tvnamer
/Users/dbr/test/bin/tvnamer

RubyGems 有这样的东西吗?

69013 次浏览

RVM 的工作方式更接近于 Virtual alenv 的工作方式,因为它允许您对不同的 Ruby 版本和它们的 gem 等进行沙箱处理。

似乎没有人提到过 Rbenv

沙盒、 RVM 和 rbenv 都无法管理应用程序的 gem 依赖版本。

  • 使用 Gemfile作为应用程序的依赖项声明
  • 使用 bundle install将这些依赖项的显式版本安装到隔离位置
  • 使用 bundle exec运行应用程序

我将提到我使用 Bundler 的方法(我使用它与 RVM-RVM 一起管理红宝石和一组默认的全局 gems,Bundler 用于处理特定项目的 gems)

bundler install --binstubs --path vendor

在项目的根目录下运行这个命令会安装 Gemfile 中列出的 gem,把 libs 放在 ./vendor中,任何 ./bin和所有 require中的可执行文件(如果你使用 bundle console或者 Bundler 需要的话)都会引用这些 ex 和 libs。

如果你只需要安装 gems 作为非 root 用户,尝试设置 GEM_HOME环境变量,然后运行 gem

例如:

$ export GEM_HOME=$HOME/local/gems
$ gem install rhc

我推荐使用 Direnv。它是 shell 的环境切换器。

在每次提示之前,它都会检查是否存在“。“ envrc”文件。如果该文件存在(并经过授权) ,则将其加载到 bash 子 shell 中,然后 direnv 捕获所有导出的变量,并使当前 shell 可用。

下面是使用 ruby-install 的 如何使用 direnv

+ ruby-install

把这个加到 ~/.direnvrc

use_ruby() {
local ruby_root=$HOME/.rubies/$1
load_prefix "$ruby_root"
layout_ruby
}

安装 ruby-Install (brew install ruby-install)并安装一些 ruby。

ruby-install ruby 1.9.3
ruby-install ruby 2.0.0
ruby-install ruby 2.2.0

然后为了方便起见,做几个符号链接:

ln -s .rubies/1.9 ruby-1.9.3-p*
ln -s .rubies/2.0 ruby-2.0.0
ln -s .rubies/2.2 ruby-2.2.0

最后,在任何项目的 .envrc中:

use ruby 2.0

这将把所有 gems 放在项目的 .direnv/ruby目录下(使得打开 gems 更容易)。Bundler 将把包装器二进制文件放在 .direnv/bin中(不再放在 bundle exec中!).

+ rbenv

还可以通过在任何 .envrc文件中添加 use rbenv命令来使用 rbenv。这将激活 rbenv,然后将红宝石包装器放入 PATH 中。

请注意,不需要在.bashrc 或.zhrc 中安装 rbenv 才能正常工作。

+ RVM

下面是我在 Ruby 项目中使用的最复杂的.envrc:

rvm use 1.8.7
layout ruby
PATH_add .direnv/bundler-bin

Rvm 用于为您选择正确的 Ruby 版本

布局命令自动设置一些常见的环境变量。目前只有红宝石布局存在。它所做的就是设置 GEM _ HOME 环境变量,并将 bin 目录设置为路径。因为它取决于 Ruby 版本,所以一定要在“ rvm”之后调用它。因为每个 Ruby 布局目录都有自己的 GEM _ HOME,所以不需要使用 rvm 的 gemset。

PATH _ add 预置并展开给定的相对路径。在这种情况下,我使用 bundle install --binstubs .direnv/bundler-bin将 bundler binstubs 与我自己的 bin 脚本隔离开来

如果你想知道这些命令到底是做什么的,现在: cat direnv stdlib | less

Mineshaft 是一个我已经工作了一段时间的项目,目前仍在继续开发中。

它提供了创建虚拟环境的能力,类似于 viralenv 的工作方式,还可以在全局范围内安装 Ruby。

这里是一位正在学习 Ruby 的经验丰富的 Python 开发人员的两分钱。使用 Rbenv和它的 Rbenv-gemset插件是迄今为止我发现的最接近 Python 虚拟环境的东西。

Rbenv 是一个针对同一平台管理多个 Ruby 版本的工具。如果您是一名 Python 开发人员,那么您可能偶然发现了 Penenv。它们有着相同的目的,事实上,PenenvRbenv的一个分支。

在不涉及太多技术细节的情况下,Rbenv使用注入到 PATH中的 SHIM 可执行文件拦截 Ruby 命令,并确定应用程序指定了哪个 Ruby 版本,然后将命令传递给正确的 Ruby 安装。

Ruby 版本可以通过许多不同的方式为项目指定。最常见的方法之一是将一个 .ruby-version文件放在包含所需版本的项目根目录中。

但是,无论何时使用某个版本安装 gems,都将在使用该版本的所有项目之间共享这些版本。

这就是 Rbenv-gemset插件派上用场的地方。与 .ruby-version文件类似,您可以初始化一个 .ruby-gemsets文件,该文件包含此项目应该安装 gems 的目录的路径(默认情况下是项目根目录中的本地 .gems目录)。从而实现了项目之间的隔离。

这是关于这个话题的 老掉牙的好文章