在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呢?
答案 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@myapp
,gem 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
所在的目录自动更改。