关于rvm和轨道之间切换的说明

时间:2014-10-01 05:27:53

标签: ruby-on-rails rvm

http://railsapps.github.io/installrubyonrails-mac.html之后,我遇到以下命令

rvm use ruby-2.1.3@rails4.1 --create
gem install rails  # installs the latest rails version
rails -v # returns 4.1.6

但是,我也可以执行以下操作,将rails版本添加到4.0.8

rvm use ruby-2.1.3@rails4.0 --create
gem install rails --version=4.0.8 # installs the latest rails version
rails -v # returns 4.0.8

这有什么意义?在文本的某处,据说这种方法是为了防止全局gem-set而是根据项目特定的gemsets安装rails?这甚至意味着什么?

这是关于如何创建新的rails项目的说明

$ mkdir myapp
$ cd myapp
$ rvm use ruby-2.1.3@myapp --ruby-version --create
$ gem install rails
$ rails new .

为什么不直接调用rails new myapp?该文本称“创建一个特定于项目的gemset”,但我不知道这意味着什么。这不会只是安装rails 4.1.6(最新版本)?为什么不首先在全球范围内安装rails 4.1.6呢?

1 个答案:

答案 0 :(得分:2)

想象一下,你是一家Rails开发人员,在过去4年里一直在做Rails应用程序的公司。你有Rails 2,Rails 3,Rails 4上的应用程序 - 随着新版本的推出,你升级你的工具集,为什么不呢?每个新版本都更好。

但是,它们不向下兼容。 Rails 2应用程序不适用于Rails 4.1。如果你被要求在攻击Rails 4的同时紧急调试Rails 2应用程序怎么办?卸载全局Rails,安装Rails 2,制作hack,然后卸载Rails 2并重新安装新的Rails,这样你就可以运行测试来解决你的单线错误了吗?

gemsets的用武之地。你有每个应用程序的环境,这样每个应用程序都可以自行运行,没有版本冲突。

如果您没有想象您的计算机上存在版本冲突的情况(例如,如果您只能想象在一个项目上工作),那么gemsets就完全无关紧要了。

编辑在评论中仍然存在一些混乱之后:)让我们一步一步地看看究竟会发生什么。

$ mkdir myapp
$ cd myapp

您现在位于一个空目录中。

$ rvm use ruby-2.1.3@myapp --ruby-version --create

rvm创建一个名为ruby-2.1.3@myapp的新gemset,它将与Ruby 2.1.3一起运行。因此,您在~/.rvm/gems/ruby-2.1.3@myapp处有一个新目录,您的gemset将在该目录中。您之前为空的myapp目录中还有两个新文件:.ruby-version(其中包含一行ruby-2.1.3}和.ruby-version(包含行myapp )。每次进入rvm目录时,myapp都会读取这两行:它为您设置当前的Ruby和gemset。

$ gem install rails

识别出当前的gemset现在是ruby-2.1.3@myappgem install命令将下载最新的rails gem及其所有依赖项,并将它们放在gemset目录中( ~/.rvm/gems/ruby-2.1.3@myapp/)。

$ get install rails --version=4.0.8

如果您尝试这样做,它将尽职尽责地安装Rails 4.0.8,但由于您的gemset中有更新的版本,并且您的应用程序没有特别的要求,因此较新的版本将优先。这通常不是你想要的;无论如何,很少有理由开发一个项目来遵守两个不同版本的库(除非你正在开发一个库或一个插件;这是一个不同的故事)。

$ rails new .

rails实际上正在执行~/.rvm/gems/ruby-2.1.3@myapp/bin/rails。如果您不在myapp目录中,链接到gemset,则此命令将失败(如果您未在全局环境中安装Rails),或执行全局安装的Rails(如果您这样做)。

因此,它并没有真正设计为在同一个项目中同时拥有两个版本的Rails。但是当你使用另一个gemset(比如ruby-2.1.3@myotherapp)创建另一个项目时,你可以拥有不同版本的Rails。该版本会根据您cd所在的目录自动更改。