【问题标题】:RVM switching Rails VersionsRVM 切换 Rails 版本
【发布时间】:2016-07-13 14:29:52
【问题描述】:

情况是我计算机上的默认 gemset 指向rails 5.0.0。但是:我有一个使用非常旧的 rails 版本的应用程序。假设此示例应用程序使用:rails 2.1.1

由于Gemfile 中指定了rails 2.1.1,当cd'ed 进入此应用程序时,我的机器是否会自动切换到rails 2.1.1?或者:我是否需要显式创建一个 gemset 以便我的应用和我的机器以“rails 2.1.1 方式”做事(而不是做事“rails 5.0.0 方式是我默认 gemset 中的 rails 版本)?

我担心的是,如果我的机器认为我在应用程序内部开发时使用rails 5.0.0 而不是rails 2.1.1:那么生成器等rails 命令可能会创建文件并执行“rails 5.0.0 方式”作为反对“rails 2.1.1”的方式。

希望这是有道理的。为了通过 Gemset “明确”声明此应用程序使用 rails 2.1.1

,我将执行以下操作

示例:

我为使用rails 2.1.1的任何应用程序创建了一个gemset

rvm gemset create rails_2_1_1

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

rvm use 2.2.1@rails_2_1_1

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

gem install rails --version=2.1.1

现在这个 gemset 使用 rails 2.1.1

现在,在我的应用程序的根目录中,我指定了一个 .ruby-gemset 文件,它告诉 rails:“确保你正在以 rails 2.1.1 的方式而不是 rails 5.0.0 的方式做事:

#.ruby-gemset
rails_2_1_1

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

【问题讨论】:

  • 你在使用 Bundler 吗?如果没有,您可以将 Bundler 添加到项目中吗?这将整齐地解决这个问题。
  • @Jordan 我正在使用 Bundler。每次我cd 进入这个应用程序时,我是否需要确保我运行bundle?或者:只是第一次为了生成Gemfile.lock 然后我不再需要这样做?
  • 您只需运行一次bundle,除非您切换到不同的 Ruby 版本(即使那样,如果您切换 back,您也不必运行bundle 再次)。如果您使用 Bundler,我认为您不需要为 gemsets 烦恼。只要您使用bundle exec,它将使用Bundler 安装的Rails 版本(即Gemfile 中的版本)。以下是有关在 RVM 中使用 Bundler 的更多信息:rvm.io/integration/bundler
  • P.S.我不知道 Rails 2.1 是否有这个命令,但Rails 2.3 command line guide mentions ./script/about 会打印当前的 Ruby 和 Rails 版本。试试bundle exec ./script/about 看看会发生什么。
  • 如果您正确设置了 .ruby-version 和 .ruby-gemset,只需 cd'ing 进入项目目录就可以使用这些东西...

标签: ruby-on-rails ruby rvm bundler


【解决方案1】:

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

设置默认 Ruby/Gemset --for system

首先,让我们在5.0.0 上为系统建立默认 ruby​​。这将允许任何新的/现有的 Rails 项目默认使用这个 ruby​​ 版本(除了那些用 Gemfile 覆盖的项目):

rvm use --default 5.0.0

..当然,如果您希望将其固定到指定的 gemset:

rvm use --default 5.0.0@my_default_gemset

Set Default Ruby/Gemset --for Rails specific App on Gemfile

示例 1

如果您想设置您的 Rails 应用程序以利用 RVM gemset 2.2.1@rails_2_1_1,类似于下面的 RVM 命令...

rvm use 2.2.1@rails_2_1_1

在您的 Gemfile 中,在 source 行的正下方指定以下两个注释行:

source 'https://rubygems.org'
#ruby=2.2.1
#ruby-gemset=rails_2_1_1

现在,当您 cd 进入您的 rails 应用程序目录时,您应该会收到以下消息,或类似消息:

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'.

您可以仔细检查您的结果:

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 ]

示例 2

另一个使用ruby-2.0.0-p247@rails-4.0.0的例子,例子RVM命令...

rvm use ruby-2.0.0-p247@rails-4.0.0

在您的 Gemfile 中,指定:

#ruby=2.0.0-p247
#ruby-gemset=rails-4.0.0

【讨论】:

    【解决方案2】:

    你也可以在你的项目目录中创建rvmrc文件,然后它会自动切换rvm

    请按照流程创建 rvmrc 文件。

    进入项目目录

     rvm use 2.2.1@rails_2_1_1
    
     rvm --rvmrc --create 2.2.1@rails_2_1_1
    

    我想这会对你有所帮助。

    【讨论】:

      【解决方案3】:

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

      $ echo '2.1.1' > .ruby-version
      

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

      $ rvm install ruby-2.1.1
      

      【讨论】:

      • 我上面的问题可能不清楚。我不关心红宝石版本。我担心 rails 版本。
      • rails gem 版本应该在 Gemfile 中调用。如果是这样,那么您的 rvm 设置并正确设置了 .ruby-version 和 .ruby-gemset 文件将执行您想要的操作。
      【解决方案4】:

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

      source 'https://rubygems.org'
      
      ruby '2.3.1'
      
      gem 'rails', '~> 4.2.7'
      ...
      

      现在介绍 Rails 版本。只要您使用bundle exec 运行命令,这些命令的版本将与Gemfile 中所述完全相同。

      项目bin/ 文件夹中还有binstubs 脚本。它们是运行命令的最佳方式,因为它们通常会根据项目需要进行调整(例如,与您的命令一起运行 spring),并且无论如何它们最终都会运行 bundle exec

      所以正确的做法是运行./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。您只需安装一次就可以忘记它。

      【讨论】:

        猜你喜欢
        • 2012-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多