Ruby相当于virtualenv吗?


165

是否有类似于Python实用程序virtualenv的东西?

基本上,它允许您将Python软件包安装到沙盒环境中,因此easy_install django它不会进入系统范围的site-packages目录中,而是会进入virtualenv创建的目录中。

例如:

$ 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是否有类似的东西?

Answers:


84

RVM的工作方式与virtualenv的工作方式更为接近,因为它可以让您沙盒化不同的红宝石版本及其宝石等。


5
尝试了沙箱和RVM,并认为RVM是更好的解决方案。
ivanjovanovic

9
伊万霍万诺维奇。为什么您发现RVM比沙盒更好?
pwan 2012年

67

沙箱,RVM和rbenv都不管理应用程序的gem依赖项的版本。该工具是bundler

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

6
另外,我个人认为人们过度使用rbenv / rvm。如果您绝对不需要在同一台计算机上有多个隔离的红宝石版本,而您也可能不需要,请不要使用rbenv / rvm。他们的“抽象”不是免费的。我保证您将不得不花时间调试它们。我的建议:只需使用操作系统的软件包管理器安装ruby。最新是最伟大的。
2014年

6
我想念什么吗?默认情况下,Bundler仍尝试在系统范围内安装软件包。
熟练地

6
在现代工作流程中,隔离环境几乎是非可选的。如果依靠系统红宝石和系统包管理器,你有保证您的安装将是可重复和多数民众会咬你的脸来部署时间。的过程中,你会偶尔会陷入战斗的怪物安装。那也是一件好事。因为您在开发环境中解决了问题,所以您永远不必在实际环境中解决问题。重复一遍,如果您获得代码的报酬,请不要使用系统环境。为了保持理智,请使用隔离的环境。
谢恩(Shayne)

19

似乎没有人提到rbenv


rbenv是一个ruby管理器,但是在软件包级别(相当于virtualenv),它本身不提供可以提供虚拟环境的gemset管理器。
yekta 2015年

16

我想您会喜欢沙盒


9
废话,重写$HOME?!那到底是什么宝石需要的是什么?可悲的是,那是我见过的最好的工作。甚至捆绑软件也默认安装在系统ruby路径中。
克里斯R

6
沙箱在大约4年内没有更新(上次提交是在2008年12月),RVM仍在积极开发中(上次提交是在昨天)
dbr 2012年

16

我将提到使用Bundler进行此操作的方式(我将其与RVM一起使用-RVM用于管理红宝石和一组默认的全局宝石,Bundler则用于处理项目特定的宝石)

bundler install --binstubs --path vendor

在项目的根目录中运行此命令将安装Gemfile中列出的gems,将libs放入中./vendor./bin并且所有requires 中的所有可执行文件(如果使用bundle console或Bundler要求)将引用这些exes和libs。

为我工作。


对于macOS上的那些提示,如果您命名路径,vendor.noindexSpotlight搜索将不会被来自供应商的gem的索引数据所困扰。
iain

1
这也是我所做的(使用rbenv,但这是另一个故事),因为它隔离了宝石和红宝石版本。整个系统都没有安装任何东西,每个项目都充分声明了所有依赖项。提示:请bundle config path vendor不要忘记该论点。
楠迪卢焦

15

如果仅需要以非root用户身份安装gem,请尝试设置GEM_HOME环境变量。然后运行gem

例如:

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

太棒了!在OSX上该文件夹是隐藏的:export GEM_HOME=$HOME/.local/gems
Bruno

1
使用起来可能更容易,GEM_HOME=$HOME/.local因此它共享相同的.bin文件夹。在这种情况下,我们不必更新$PATH变量。
布鲁诺


到目前为止,我所见过的最干净的无依赖方法是安装在更新时不会相互破坏的工具(剩下的就是在您的别名中添​​加一个别名,您~/.bashrc就可以完成了)。+1
Paradoxis

4

我推荐direnv。它是外壳的环境切换器。

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

这是如何在 ruby-install中使用direnv

+红宝石安装

将此添加到 ~/.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

这会将所有gem放置在项目.direnv/ruby目录下(使打开gem更加容易)。捆绑程序将放入包装二进制文件 .direnv/bin(不再bundle exec!)。

+ rbenv

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

请注意,不必在.bashrc或.zshrc中安装rbenv即可起作用。

+ RVM

这是我在ruby项目上使用的最复杂的.envrc:

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

rvm用于为您选择正确的红宝石版本

布局命令会自动设置一些常用的环境变量。目前仅存在红宝石布局。它的作用是设置GEM_HOME环境变量,并将它放在bin目录中。因为它取决于Ruby版本,所以请确保在“ rvm”之后调用它。由于每个ruby布局目录都有其自己的GEM_HOME,因此您无需使用rvm的gemset。

PATH_add前置并扩展给定的相对路径。在这种情况下,我使用它来将捆绑程序binstub与我自己的bin脚本隔离,bundle install --binstubs .direnv/bundler-bin

如果您想了解这些命令的确切功能,现在:cat direnv stdlib| 减


2
尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。- 评分
jezrael

@jezrael谢谢您的评论!
Shin Kim

1
超级,没问题。
jezrael

1

Mineshaft是一个我已经从事了一段时间的项目,并将继续进行开发工作。

它提供了创建类似于virtualenv工作原理的虚拟环境的能力,并且还可以全局安装Ruby。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.