TL;DR
- 不要为Ruby 烦恼;可以同时安装多个版本的gem.
- 必要时,使用
$ gem-based-binary _version_ args
符号指定要执行的版本. - 如果有指定版本的文件,请使用
bundle exec
.
gem install rails -v 3.2.13
rails _3.2.13_ new Project2
cd Project2
bundle exec rails server
UPDATE: 2015-06-04
我三年前写过这个问题.部分原因是基于错误的假设,部分原因是自那以后情况发生了变化.感谢@indirect给出了他最初的答案,我想提请大家注意@kelvin更新的(不太上浮的)答案,总结如下.
我的错误假设是:一次只能安装一个版本的gem,因此gems需要隔离名称空间.不是真的.可以同时安装多个版本的gem.从命令行调用时将使用最新的版本,除非您有一个指定版本约束的文件,并通过bundle exec
调用该命令,或将版本指定为其第一个参数.
另请参见How can I call an older version of a gem from the commandline? re:下划线版本符号.
Original question:
我有多个项目正在使用不同版本的Rails.我有一个工作流(如下所述),用于使用特定版本的rails创建项目,并将项目彼此隔离.我想try 其他工作流,尤其是使用rbenv而不是RVM,但不清楚如何做到这一点.
QUESTION:当使用rbenv和bundler而不是rbenv gemset或rvm时,创建多个rails项目(每个项目使用不同版本的rails)的best current practice是什么?
我有两个rails项目,分别是ProjectA和ProjectB.ProjectA使用rails的一个版本("RailsA")开发,而ProjectB使用另一个版本("RailsB").如何安装这两个版本?
THE GEMSETS APPROACH:当我第一次开始Rails开发时,我使用了RVM.除了支持ruby的多个并发安装之外,RVM还支持多个应用程序.每个项目都有自己独立的gems集合(包括rails本身),称为gems集:
rvm gemset create RailsA
rvm gemset use RailsA
# RailsA. Note: My question is not version-specific.
gem install rails --version 3.0
rails new ProjectA
cd ProjectA
rvm --rvmrc use `rvm current`
vi Gemfile
bundle install
cd ..
## Now do the same for ProjectB
rvm gemset create RailsB
rvm gemset use RailsB
gem install rails --version 3.2
rails new ProjectB
cd ProjectB
rvm --rvmrc use `rvm current`
vi Gemfile
bundle install
注意:由于骨架文件的版本不同,所以项目文件夹中的creation个应该通过使用desired version个rails的rails new
命令来完成(IMHO).(也许我应该重新审视这个前提?)
THE BUNDLER APPROACH:我一直在使用rbenv而不是RVM,但我不太清楚工作流程.在README.md中,Sam Stephenson写道,"rbenv不…管理Gemset.Bundler是管理应用程序依赖关系的更好方法."有一个插件(rbenv-gemset)可以获得与rvm的gemsets相同的结果,但Sam显然更喜欢使用Bundler.不幸的是,他没有详细说明工作流程会是什么样子.就连Bundler网站也没有明确地将如何将一个项目与另一个项目隔离的所有要点联系起来.有blogs and gists人前来救援,他们提出了以下~/.bundle/config
个文件:
---
BUNDLE_PATH: vendor/bundle
(顺便说一句,我不确定"--"是关于什么的.文件中没有提到它,似乎也没有什么区别.)
这有效地 for each rails项目提供了自己的gems集,将gems存储在ProjectX/vendor/bundle/中.事实上,rails本身将(重新)安装在那里,一旦我运行bundle install
次,该项目将完全独立于我环境的其他部分.
But the elephant in the room is the chicken-and-egg problem of creating the rails project folder in the first place!!为了使用RailsA创建ProjectA文件夹,我需要安装rails(及其众多依赖项)first.但当我想创建ProjectB时,我必须切换到使用RailsB.没有Ruby ,我必须做一些严重的升级/降级.不酷.
一个可能的解决方案就是不用担心我使用什么版本的rails来创建ProjectX文件夹.如果我使用rails 3.0创建一个3.2项目,我就可以手动创建app/assets树.但这让我很恼火.难道没有更好的办法吗?