首页 > 解决方案 > 在 Rails 3.2.22 上将 Ruby 2.0.0 升级到 2.1.0 的问题

问题描述

macOS 10.14.6 上的 Rails 3.2.22 和 Ruby 2.0.0。应用程序正常运行,所有测试均通过 - Rspec,427 次测试,0 次失败。

宝石被捆绑到/vendor/bundle. 我曾经ruby-install安装 ruby​​ 版本并chruby根据.ruby-version文件自动切换。我还在GemfileHeroku 中定义了 ruby​​ 版本。

# Gemfile
source 'https://rubygems.org'
ruby '2.0.0'
...
# .ruby-version
ruby-2.0.0

当我移至 Ruby 2.1.0 时Gemfile.ruby-version我无法再bundle install启动或启动应用程序:

$ bundle install
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/rubygems.rb:241:in `bin_path': can't find gem bundler (>= 0.a) (Gem::GemNotFoundException)
        from /usr/local/bin/bundle:22:in `<main>'
$ foreman start
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/rubygems.rb:241:in `bin_path': can't find gem foreman (>= 0.a) (Gem::GemNotFoundException)
        from /usr/local/bin/foreman:22:in `<main>'

我无法安装捆绑程序:

$ gem install bundler
ERROR:  While executing gem ... (Gem::Exception)
    Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources

到目前为止我尝试了什么

如果我回到“Gemfile”中的 Ruby 2.0.0 并且-ruby-version应用程序运行但 Rspec 失败并出现大量warning: already initialized constantfor和activerecord,即使应用程序中没有任何变化,或者.activesupportpaper_trailGemfileGemfile.lock

让它在 Ruby 2.0.0 上再次运行的唯一方法是用bundle clean --force新的bundle install.

出现错误后,openssl我从中删除了 Ruby 2.1.0~/.rubies/并重新安装了选项,指定了我的openssl安装路径(在从 中找到它之后brew):

$ brew --prefix openssl@1.0
/usr/local/opt/openssl@1.0
$ ruby-install ruby 2.1.0 -- --with-openssl-dir=/usr/local/opt/openssl@1.0

Ruby 2.1.0 安装正确,我尝试安装bundler我得到:

$ gem install budler
Fetching: bundler-2.1.4.gem (100%)
ERROR:  Error installing bundler:
        bundler requires Ruby version >= 2.3.0.

我安装了bundler创建的特定版本Gemfile.lock

$ gem install bundler -v "1.17.3"
Fetching: bundler-1.17.3.gem (100%)
Successfully installed bundler-1.17.3
Parsing documentation for bundler-1.17.3
Installing ri documentation for bundler-1.17.3
Done installing documentation for bundler after 8 seconds
1 gem installed

但随后bundle install未能说 Ruby 版本是 2.3.7:

$ bundle install
Your Ruby version is 2.3.7, but your Gemfile specified 2.1.0
$ ruby -v
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin18.0]

看起来对 Ruby 2.3.7 的引用来自这里:

$ bundle env
## Environment

Bundler       1.17.3
  Platforms   ruby, universal-darwin-18
Ruby          2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]
  Full Path   /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby
  Config Dir  /Library/Ruby/Site
RubyGems      2.5.2.3
  Gem Home    /Users/dan/.gem/ruby/2.1.0
  Gem Path    /Users/dan/.gem/ruby/2.1.0:/Users/dan/.rubies/ruby-2.1.0/lib/ruby/gems/2.1.0
  User Path   /Users/dan/.gem/ruby/2.3.0
  Bin Dir     /Users/dan/.gem/ruby/2.1.0/bin
Tools         
  Git         2.20.1 (Apple Git-117)
  RVM         not installed
  rbenv       not installed
  chruby      0.3.9

我发现了这个问题:Bundler using wrong Ruby version with a comment to try hash -r:“可能是您的 shell 缓存了旧的捆绑命令,请尝试运行 hash -r。-matt”

这似乎修复了 Bundle 中硬编码的 Ruby 版本:

$ hash -r
$ bundle env
## Environment

Bundler       1.17.3
  Platforms   ruby, x86_64-darwin-18
Ruby          2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin18.0]
  Full Path   /Users/dan/.rubies/ruby-2.1.0/bin/ruby
  Config Dir  /Users/dan/.rubies/ruby-2.1.0/etc
RubyGems      2.2.0
  Gem Home    /Users/dan/.gem/ruby/2.1.0
  Gem Path    /Users/dan/.gem/ruby/2.1.0:/Users/dan/.rubies/ruby-2.1.0/lib/ruby/gems/2.1.0
  User Path   /Users/dan/.gem/ruby/2.1.0
  Bin Dir     /Users/dan/.gem/ruby/2.1.0/bin
Tools         
  Git         2.20.1 (Apple Git-117)
  RVM         not installed
  rbenv       not installed
  chruby      0.3.9

Bundle 现在引用 Ruby 2.1.0,我可以成功bundle install

但是现在我在运行 Rspec 或启动应用程序时遇到语法错误:

$ bundle exec rspec
WARNING: Nokogiri was built against LibXML version 2.9.10, but has dynamically loaded 2.9.4
/Users/dan/Documents/code/lessonmate/vendor/bundle/gems/browser-5.1.0/lib/browser/browser.rb:9:in `require_relative': /Users/dan/Documents/code/lessonmate/vendor/bundle/gems/browser-5.1.0/lib/browser/accept_language.rb:37: syntax error, unexpected '.' (SyntaxError)
        code&.downcase
$ bundle exec rails server
/Users/dan/Documents/code/lessonmate/vendor/bundle/gems/uniform_notifier-1.12.0/lib/uniform_notifier.rb:3:in `require': /Users/dan/Documents/code/lessonmate/vendor/bundle/gems/uniform_notifier-1.12.0/lib/uniform_notifier/base.rb:37: syntax error, unexpected <<, expecting keyword_end (SyntaxError)
      <<~CODE
        ^

使用 Ruby 2.0.0:

$RUBY_ROOT /Users/dan/.rubies/ruby-2.0.0-p648
$RUBY_ENGINE ruby
$RUBY_VERSION 2.0.0
$GEM_ROOT /Users/dan/.rubies/ruby-2.0.0-p648/lib/ruby/gems/2.0.0
$GEM_HOME /Users/dan/.gem/ruby/2.0.0
$GEM_PATH /Users/dan/.gem/ruby/2.0.0:/Users/dan/.rubies/ruby-2.0.0-p648/lib/ruby/gems/2.0.0
$PATH /Users/dan/.gem/ruby/2.0.0/bin:/Users/dan/.rubies/ruby-2.0.0-p648/lib/ruby/gems/2.0.0/bin:/Users/dan/.rubies/ruby-2.0.0-p648/bin:/Users/dan/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/dan/bin:/Users/dan/bin

$ gem env
RubyGems Environment:
  - RUBYGEMS VERSION: 2.0.14.1
  - RUBY VERSION: 2.0.0 (2015-12-16 patchlevel 648) [x86_64-darwin18.7.0]
  - INSTALLATION DIRECTORY: /Users/dan/.gem/ruby/2.0.0
  - RUBY EXECUTABLE: /Users/dan/.rubies/ruby-2.0.0-p648/bin/ruby
  - EXECUTABLE DIRECTORY: /Users/dan/.gem/ruby/2.0.0/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-darwin-18
  - GEM PATHS:
     - /Users/dan/.gem/ruby/2.0.0
     - /Users/dan/.rubies/ruby-2.0.0-p648/lib/ruby/gems/2.0.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - https://rubygems.org/

使用 Ruby 2.1.0:

$RUBY_ROOT /Users/dan/.rubies/ruby-2.1.0
$RUBY_ENGINE ruby
$RUBY_VERSION 2.1.0
$GEM_ROOT /Users/dan/.rubies/ruby-2.1.0/lib/ruby/gems/2.1.0
$GEM_HOME /Users/dan/.gem/ruby/2.1.0
$GEM_PATH /Users/dan/.gem/ruby/2.1.0:/Users/dan/.rubies/ruby-2.1.0/lib/ruby/gems/2.1.0
$PATH /Users/dan/.gem/ruby/2.1.0/bin:/Users/dan/.rubies/ruby-2.1.0/lib/ruby/gems/2.1.0/bin:/Users/dan/.rubies/ruby-2.1.0/bin:/Users/dan/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/dan/bin:/Users/dan/bin

$ gem env
RubyGems Environment:
  - RUBYGEMS VERSION: 2.2.0
  - RUBY VERSION: 2.1.0 (2013-12-25 patchlevel 0) [x86_64-darwin18.0]
  - INSTALLATION DIRECTORY: /Users/dan/.gem/ruby/2.1.0
  - RUBY EXECUTABLE: /Users/dan/.rubies/ruby-2.1.0/bin/ruby
  - EXECUTABLE DIRECTORY: /Users/dan/.gem/ruby/2.1.0/bin
  - SPEC CACHE DIRECTORY: /Users/dan/.gem/specs
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-darwin-18
  - GEM PATHS:
     - /Users/dan/.gem/ruby/2.1.0
     - /Users/dan/.rubies/ruby-2.1.0/lib/ruby/gems/2.1.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - https://rubygems.org/
  - SHELL PATH:
     - /Users/dan/.gem/ruby/2.1.0/bin
     - /Users/dan/.rubies/ruby-2.1.0/lib/ruby/gems/2.1.0/bin
     - /Users/dan/.rubies/ruby-2.1.0/bin
     - /Users/dan/bin
     - /usr/local/bin
     - /usr/bin
     - /bin
     - /usr/sbin
     - /sbin
     - /Users/dan/bin
     - /Users/dan/bin

标签: ruby-on-railsrubyrubygemsbundler

解决方案


推荐阅读