RVM,RubyGems和Bundler的日常使用
许多Ruby应用都使用RVM+RubyGems+Bundler来管理自身的执行环境,其中包括Ruby的版本管理和软件包(gems)管理,本文使用ruby-1.9.2-p290, Rubygems-1.8.10和bundler-1.0.21简单介绍此三者的简单使用。
(1)使用RubyGems
RubyGems是随着Ruby一起安装的,当安装好Ruby之后,RubyGems对应的命令gem便可以使用,gem命令用来安装Ruby世界的第三方软件包,这些软件包被称作gems,类似于Wndows下dll文件或Linux下的so文件,但是一个Gem并不是单个文件,而是具有一定目录结构的文件夹。请注意,“gem”既表示RubyGems的命令,又可表示某个Ruby软件包,为了不至混淆,本文采用"gem"表示RubyGems的命令,而用"Gem"表示一个Ruby软件包。
例如,安装名为“rake”的软件包:
gem install rake
gem命令将自动从网上下载该软件包,然后进行安装。
列出已经安装的软件包:
gem list
此外,gem命令还可以用来构建你自己的Gem。
(2)使用RVM
在终端下执行以下命令便可安装rvm:
bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
安装完毕后rvm还不能立即使用,须要将以下脚本追加到当前用户主目录下的.bashrc文件。
[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"
在Linux下建议使用非root用户安装rvm,这样rvm将被安装在当前用户的主目录下的.rvm 文件夹(隐藏文件夹), 如果需要删除rvm,直接删除该.rvm文件夹即可。
使用rvm命令列出当前可以安装的ruby版本:
rvm list known
安装某ruby版本(例如ruby-1.9.2-p290):
rvm install ruby-1.9.2-p290
使用某ruby版本:
rvm use ruby-1.8.7-head
如果在该命令之后加上--default选项,将在每次启动终端时默认使用该ruby版本。
rvm除了可以管理不同的ruby版本外,还可以为每个ruby版本创建不同的Gem集合(gemsets),从而使不同的Ruby应用可以独立使用自己的Gem集合。比如在使用ruby-1.9.2-p290的情况下,我需要建立两个rails工程,一个使用rails-3.0,一个使用rails-3.1.0,我们便可创建两个gemset,并在各个gemset下分别安装对应的rails版本和所需其他Gem:
rvm gemset create rails-3.0 #创建名为rails-3.0的gemset rvm 1.9.2-p290@rails-3.0 #使用ruby-1.9.2-p290并使用rails-3.0 gemset gem install rails -v 3.0 #在rails-3.0 gemset下安装rails的3.0版本 rvm gemset create rails-3.1.0 #创建名为rails-3.1.0的gemset rvm 1.9.2-p290@rails-3.1.0 #使用ruby-1.9.2-p290并使用rails-3.1.0 gemset gem install rails -v 3.1.0 #在rails-3.0 gemset下安装rails的3.1.0版本
使用以下命令可以列出当前Ruby版本下的所有gemset:
rvm gemset list
在笔者的ubuntu机器下输出如下:
gemsets for ruby-1.9.2-p290 (found in /home/eudy/.rvm/gems/ruby-1.9.2-p290) default global mass-opinion-rails3.1.0 => Miss_India_in_Cucumber_Way watirmelon-cucumber
第1行表明目前正使用ruby-1.9.2-p290,以下几行每行为一个gemset, “=> ”表明当前正使用的gemset。
(3)使用Bundler
bundler主要用于管理Ruby应用程序的依赖关系,并按照此依赖关系安装所需的Gems。当运行bundle install命令来安装Gems时,bundler会使用当前目录下的名为Gemfile的文件来处理依赖关系。
以下是一个简单的Gemfile内容:
source "http://rubygems.org" gem "nokogiri" gem "rack", "~>1.1" gem "rspec", :require => "spec"
文件第1行表明bundler会从http://rubygems.org下载Gems;第2行表明需要名为nokogiri的Gem;第3行表明需要名为rack的Gem,并且版本必须高于1.1;第4行表明rspec依赖于spec, 所以spec将先于rspec安装。