RVM切换Rails版本

时间:2016-07-13 14:29:52

标签: ruby-on-rails ruby rvm bundler

情况是我的计算机上的默认gemset指向rails 5.0.0。但是:我有一个使用非常古老的rails版本的应用程序。让我们说这个例子应用程序使用:rails 2.1.1

由于rails 2.1.1中指定了cd'ed,我的计算机会在rails 2.1.1 Gemfile时自动切换到rails 5.0.0吗?或者:我是否需要 明确地 创建一个gemset,以便我的应用程序和我的机器能够以“rails 2.1.1方式”执行操作(而不是执行操作“rails 5.0.0方式,这是我的默认gemset中的rails版本?”

我担心的是,如果我的机器在app内部开发时认为我正在使用rails 2.1.1而不是rails 2.1.1:那么诸如生成器之类的rails命令可能会创建文件并执行“rails 5.0”。 0方式“而不是”rails 2.1.1“方式。

希望这是有道理的。以下是我要通过Gemset“明确”说明此应用使用rails 2.1.1

的内容

示例:

我创建了一个gemset,可以为使用rvm gemset create rails_2_1_1

的任何应用指定
rvm use 2.2.1@rails_2_1_1

我指定要在此gemset上使用的ruby版本

gem install rails --version=2.1.1

然后我将旧版本的rails安装到这个gemset上:

rails 2.1.1

现在这个gemset使用.ruby-gemset

现在,在我的应用程序的根目录中,我指定了一个rails 2.1.1文件,告诉我们:“确保以rails 5.0.0方式而不是#.ruby-gemset rails_2_1_1 方式执行操作:

SELECT    SQL_CALC_FOUND_ROWS t.*, 
          Count(DISTINCT l.lead_id) AS leads, 
          Count(DISTINCT v.user_id) AS views
FROM      trading t 
LEFT JOIN leads l ON t.trade_id = l.trade_id 
LEFT JOIN post_view v ON t.trade_id = v.trade_id AND v.user_id != %s
WHERE     t.user_id = %s AND t.published = %s 
GROUP BY  t.trade_id 
ORDER BY  timestamp DESC 
LIMIT     $start, $perpage

我想确定如果应用程序的Gemfile中指定了另一个rails版本而不是我的默认gemset:那么在该应用程序内开发将在Gemfile中指定的rails版本的上下文中执行所有操作,而不是rails默认gemset中的版本。

4 个答案:

答案 0 :(得分:2)

这不是RVM和Rails的问题。使用Gemfile是最好的方法,恕我直言!在你的Gemfile中,你可以指定使用哪个ruby和哪个gemset。

设置默认Ruby / Gemset - 用于系统

首先,让我们为 { "chat" : { "armobiliya@gmail-com-doggieshome007@gmail-com" : { "-KN8QNQeARA3T5esXvn2" : { "message" : "hi doggy how are you?", "recipient" : "utb0d5LBQ0VOs8R0V3qJmNxeT9t2", "sender" : "JY6HQlltFCUqps3YDzGYLat7YLC3" }, "-KN8QSDUfGJwaao33nkd" : { "message" : "I am fine ...n you?", "recipient" : "JY6HQlltFCUqps3YDzGYLat7YLC3", "sender" : "utb0d5LBQ0VOs8R0V3qJmNxeT9t2" }, "-KN8QV1tuY5imq11EyhY" : { "message" : "me too", "recipient" : "utb0d5LBQ0VOs8R0V3qJmNxeT9t2", "sender" : "JY6HQlltFCUqps3YDzGYLat7YLC3" }, "-KN8QaYfdXmKuceLqdkP" : { "message" : "missing you\uD83D\uDE25", "recipient" : "utb0d5LBQ0VOs8R0V3qJmNxeT9t2", "sender" : "JY6HQlltFCUqps3YDzGYLat7YLC3" }, "-KN8Qd1PK_iFfKD6w8gL" : { "message" : "ohhhhh\uD83D\uDE0A", "recipient" : "JY6HQlltFCUqps3YDzGYLat7YLC3", "sender" : "utb0d5LBQ0VOs8R0V3qJmNxeT9t2" }, "-KN8Ql8-ONrsL3TdWfFO" : { "message" : "\uD83C\uDF82\uD83C\uDF82\uD83C\uDF82\uD83C\uDF82\uD83C\uDF82\uD83C\uDF82happy birthday", "recipient" : "JY6HQlltFCUqps3YDzGYLat7YLC3", "sender" : "utb0d5LBQ0VOs8R0V3qJmNxeT9t2" }, "-KN8QwIt0x08O-_Y4Sc5" : { "message" : "Thank you dear\uD83D\uDE18", "recipient" : "utb0d5LBQ0VOs8R0V3qJmNxeT9t2", "sender" : "JY6HQlltFCUqps3YDzGYLat7YLC3" }, "-KN8R5jX9ZKiFBpGhFd2" : { "message" : "\uD83D\uDE03", "recipient" : "utb0d5LBQ0VOs8R0V3qJmNxeT9t2", "sender" : "JY6HQlltFCUqps3YDzGYLat7YLC3" } } }, "users" : { "JY6HQlltFCUqps3YDzGYLat7YLC3" : { "avatarId" : 1, "connection" : "offline", "createdAt" : "1469036893226", "firstName" : "Doggies Home", "userEmail" : "doggieshome007@gmail.com" }, "utb0d5LBQ0VOs8R0V3qJmNxeT9t2" : { "avatarId" : 1, "connection" : "offline", "createdAt" : "1469036965579", "firstName" : "Mobiliya AR", "userEmail" : "armobiliya@gmail.com" } } } 上的系统确定默认 ruby​​。这将允许任何新的/现有的Rails项目默认为这个ruby版本(除了那些用Gemfile覆盖的项目):

5.0.0

..当然,如果你想将它固定到指定的gemset:

rvm use --default 5.0.0

设置默认的Ruby / Gemset - 用于Gemfile上的Rails特定应用程序

示例1

如果您想设置rails应用程序以使用RVM gemset rvm use --default 5.0.0@my_default_gemset ,类似于下面的RVM命令......

2.2.1@rails_2_1_1

在你的Gemfile中,在rvm use 2.2.1@rails_2_1_1 行的正下方指定以下两行注释:

source

现在,当您source 'https://rubygems.org' #ruby=2.2.1 #ruby-gemset=rails_2_1_1 进入rails'app目录时,您应该会收到以下消息,或者类似于:

cd

您可以仔细检查结果:

RVM used your Gemfile for selecting Ruby, it is all fine - Heroku does 
that too, you can ignore these warnings with 'rvm rvmrc warning ignore 
/my/rails/app/path/Gemfile'.

To ignore the warning for all files run 'rvm rvmrc warning ignore
allGemfiles'.

示例2

使用rvm list gemsets ruby-2.2.1 [ x86_64 ] ruby-2.2.1@global [ x86_64 ] => ruby-2.2.1@rails_2_1_1 [ x86_64 ] ruby-5.0.0 [ x86_64 ] ruby-5.0.0@global [ x86_64 ] 的另一个示例,示例RVM命令...

ruby-2.0.0-p247@rails-4.0.0

在Gemfile中,指定:

rvm use ruby-2.0.0-p247@rails-4.0.0

答案 1 :(得分:1)

您还可以将rvmrc文件创建到项目目录中,然后它将自动切换rvm

请按照流程创建rvmrc文件。

转到项目目录

 rvm use 2.2.1@rails_2_1_1

 rvm --rvmrc --create 2.2.1@rails_2_1_1

我认为这会对你有所帮助。

答案 2 :(得分:0)

您可以在项目的文件夹中创建.ruby-version文件,RVM将自动切换到正确的Ruby。像这样:

$ echo '2.1.1' > .ruby-version

您只需要确保安装了该版本,例如:

$ rvm install ruby-2.1.1

答案 3 :(得分:0)

首先,我建议不要使用.ruby-gemset文件,因为Gemfile已经拥有了您需要的所有内容。 .ruby-version也已过时,因为Ruby版本也可以在Gemfile内指定:

source 'https://rubygems.org'

ruby '2.3.1'

gem 'rails', '~> 4.2.7'
...

现在关于Rails版本。只要您使用bundle exec运行命令,这些命令就会被执行。版本将完全按照Gemfile中的说明。

项目binstubs文件夹中还有bin/个脚本。它们是运行命令的最佳方式,因为它们通常会针对项目需求进行调整(例如,与命令一起运行spring),并且最终它们最终会运行bundle exec。 / p>

所以正确的做法是运行./bin/rails,这可能很乏味。这就是我推荐使用助手的原因。例如,oh-my-zsh项目具有开箱即用的rails插件。前几行(请参阅下面的解释):

function _rails_command () {
  if [ -e "bin/rails" ]; then
    bin/rails $@
  elif [ -e "script/rails" ]; then
    ruby script/rails $@
  elif [ -e "script/server" ]; then
    ruby script/$@
  else
    command rails $@
  fi
}

function _rake_command () {
  if [ -e "bin/rake" ]; then
    bin/rake $@
  elif type bundle &> /dev/null && [ -e "Gemfile" ]; then
    bundle exec rake $@
  else
    command rake $@
  fi
}

alias rails='_rails_command'
compdef _rails_command=rails

alias rake='_rake_command'
compdef _rake_command=rake

运行rails时,此脚本会检查bin/rails是否存在(默认为Rails 5和4)并运行它。如果不是,则脚本检查script/rails(默认为Rails 3)和script/server(默认为Rails 2)。所以基本上你涵盖了所有版本。同样适用于rake

使用此插件,您永远不必担心额外的命令。始终只需运行rails。你只需安装一次而忘记它。