执行bundle update时安装Gemfile未声明的date gem失败
问题描述
我在修复并构建一个Rails应用时,执行bundle update遇到以下错误:
$ bundle update /usr/share/rvm/gems/ruby-2.1.5@global/gems/bundler-1.7.6/lib/bundler.rb:302: warning: Insecure world writable dir /usr/share/rvm in PATH, mode 042777 Updating https://github.com/Compass/compass-rails Updating https://github.com/DavyJonesLocker/client_side_validations-simple_form Updating https://github.com/DavyJonesLocker/client_side_validations Updating https://github.com/seyhunak/twitter-bootstrap-rails.git Fetching source index from https://rubygems.org/ Resolving dependencies........ Using rake 12.0.0 Using i18n 0.7.0 Using json 1.8.0 Using minitest 5.10.3 Using thread_safe 0.3.6 Using tzinfo 1.2.10 (was 1.2.3) Using activesupport 4.2.5 Using builder 3.2.4 (was 3.2.3) Using erubis 2.7.0 Using mini_portile2 2.1.0 Using nokogiri 1.6.8.1 Using rails-deprecated_sanitizer 1.0.4 (was 1.0.3) Using rails-dom-testing 1.0.9 (was 1.0.8) Using crass 1.0.6 Using loofah 2.19.1 (was 2.0.3) Using rails-html-sanitizer 1.4.4 (was 1.0.3) Using actionview 4.2.5 Using rack 1.6.13 (was 1.6.8) Using rack-test 0.6.3 Using actionpack 4.2.5 Using globalid 0.4.2 (was 0.3.6) Using activejob 4.2.5 Using mini_mime 1.1.2 Gem::InstallError: date requires Ruby version >= 2.6.0. An error occurred while installing date (3.3.3), and Bundler cannot continue. Make sure that `gem install date -v '3.3.3'` succeeds before bundling.
排查情况:
- 遍历Gemfile中所有gem,未找到直接依赖
date的项 - 用
gem dependency {gem}循环排查30次,仍无结果 - 执行
gem dependency date --reverse-dependencies,也未找到相关依赖
我的Gemfile内容如下:
source 'https://rubygems.org' gem 'rails', '4.2.5' gem 'concurrent-ruby', '1.0.0' gem 'minitest', "5.10.3" gem 'connection_pool', "2.2.0" #gem for facebook bot gem 'facebook-messenger' , "0.11.1" # Bundle edge Rails instead: # gem 'rails', :git => 'git://github.com/rails/rails.git' gem 'mysql2', '0.3.20' #, '~> 0.3.13' gem 'rack-ssl', '1.3.4', :require => 'rack/ssl' gem 'execjs', '2.6.0' #gem 'therubyracer' #gem 'rack' , '1.4.5' gem 'json', '1.8.0' gem 'protected_attributes', '1.1.3' gem 'gdata_19', '1.1.5' gem 'foreverb', '0.3.3' gem 'paper_trail', '3.0.1' gem 'rack-cors', '0.4.0' #gem 'exception_notification' gem 'social-share-button', '0.8.0' # gem 'contacts', :git => 'git@github.com:eofferma/contacts.git' # Deploy with Capistrano gem 'puma', '3.4.0' gem 'noty-rails', '2.3.8' #gem 'rvm-capistrano' gem 'active_model_serializers', '0.9.3' gem "font-awesome-rails", '4.6.3.0' gem 'therubyracer', '0.12.2', platforms: :ruby gem 'sunspot_rails','2.2.0' gem 'sunspot_solr', '2.2.2' gem 'capybara', '2.7.1' gem 'poltergeist', '1.8.1' gem 'simplecov', '0.8.2', :require => false, :group => :test gem 'sidekiq', '4.1.1' group :development do gem "better_errors", "2.1.1" gem "binding_of_caller", "0.7.2" gem 'quiet_assets', '1.1.0' end gem 'nokogiri', "1.6.8.1" gem 'sprockets', "3.5.2" gem 'sass-rails',"5.0.4" gem 'compass-rails', git: "https://github.com/Compass/compass-rails", branch: "master" #gem 'compass-rails', github: "Compass/compass-rails", branch: "master" gem 'uglifier', "2.7.2" gem 'compass', "1.0.3" gem 'compass-h5bp', '0.1.1' gem 'haml-rails', "0.9.0" # Optional - to generate haml gem 'jquery-rails' , "4.1.0" #must be fixed because current version of multiselect widget doesn't work with jquery version >= 1.8.0 gem 'fancybox-rails', "0.3.1" gem 'jquery-ui-rails', "5.0.5" gem 'html5-rails', '0.1.0' # To use ActiveModel has_secure_password # gem 'bcrypt-ruby', '~> 3.0.0' # Use unicorn as the web server # gem 'unicorn' # Deploy with Capistrano # gem 'capistrano' # To use debugger # gem 'ruby-debug' gem 'slim-rails', "3.0.1" gem 'devise', "4.3.0" gem 'devise-encryptable', "0.1.2" #gem 'devise-token_authenticatable' gem 'coffee-rails', "4.1.0" gem "omniauth-facebook", "4.0.0" gem "omniauth-twitter", "1.4.0" gem "omniauth-google-oauth2", "0.5.2" gem "koala", "2.2.0" gem "fb_graph", "2.7.17" gem 'twitter', "5.15.0" gem "ancestry", "2.1.0" gem 'simple_form', "3.2.0" gem 'client_side_validations-simple_form', git: 'https://github.com/DavyJonesLocker/client_side_validations-simple_form', :ref => 'e6b61d5a82537a4d1d6d5259b8fd07f865ef89c9' #gem 'client_side_validations-simple_form', github: 'DavyJonesLocker/client_side_validations-simple_form' gem 'paperclip', '4.2.0' gem 'aws-sdk', '< 2.0' #gem 'client_side_validations' gem 'client_side_validations', git: 'https://github.com/DavyJonesLocker/client_side_validations', :ref => '4f000000a858a46d830a4b2aec1e8d6f41f58685' #gem 'client_side_validations', github: 'DavyJonesLocker/client_side_validations' gem 'will_paginate', "3.0.7" gem 'browser', "1.0.1" #gem 'twitter-bootstrap-rails', :git => 'git@github.com:seyhunak/twitter-bootstrap-rails.git', :branch => 'bootstrap3' gem 'twitter-bootstrap-rails', :git => 'https://github.com/seyhunak/twitter-bootstrap-rails.git', :branch => 'bootstrap3' # gem 'geokit-rails' gem "recaptcha", '0.5.0', :require => "recaptcha/rails" gem 'whenever', "0.9.4", :require => false gem "activemerchant", "1.43.3" gem "hpricot", "0.8.6" gem 'money', "6.6.1" gem 'contacts', "1.2.4" gem "paypal-sdk-merchant", "1.116.0" gem 'paypal-sdk-adaptivepayments', "1.117.0" gem 'fastercsv', "1.5.5" gem 'cmess', "0.5.0" gem "grape", "0.13.0" gem 'wine_bouncer', '0.5.0' gem 'httparty', "0.13.7" gem 'delayed_job_active_record', "4.1.0" gem "daemons", "1.2.3" gem "rake", "12.0.0" gem "rake-progressbar", "0.0.5" gem "httpclient", "2.7.0.1" gem 'typhoeus', "0.8.0" gem 'tire', "0.6.2" gem 'roo', '1.10.3' # gem 'rubyzip', '< 1.0.0', :require => false gem 'google_places', "0.32.0" gem 'foursquare2', "2.0.2" gem 'twilio-ruby', "4.8.0" gem 'mechanize', "2.7.3" gem 'orm_adapter', "0.5.0" # gem 'capybara' # gem 'wombat' # gem 'capybara-webkit' #gem 'elasticsearch' gem 'rails3-jquery-autocomplete', "1.0.15" gem 'selenium-webdriver', '2.53.4' # gem 'selenium-webdriver' # gem 'poltergeist' group :test do # gem 'phantomjs', :require => 'phantomjs/poltergeist' gem 'database_cleaner', "1.5.1" gem 'rspec-rails', "3.4.0" # gem 'selenium-webdriver' # gem 'poltergeist' end group :development, :test do gem 'thin', "1.7.0" #gem 'machinist' gem 'faker', "1.5.0" gem 'rails-dev-tweaks', "1.2.0" gem 'byebug', "8.2.1" end gem "paranoia", "2.1.4" gem 'rails-observers', "0.1.2" gem 'activerecord-session_store', "0.1.2" gem 'useragent', "0.10.0" gem 'acts_as_commentable', "4.0.2" gem "iconv", "1.0.4" gem "rails-erd", "1.4.1" gem 'zeroclipboard-rails', "0.1.1" #source 'https://rails-assets.org' do #gem 'rails-assets-reveal' #end
解决方案
1. 锁定date gem兼容版本
date gem从3.x版本开始要求Ruby >=2.6.0,而你的Ruby版本是2.1.5,直接在Gemfile中添加版本限制:
gem 'date', '< 3.0'
添加后执行bundle install,Bundler会自动选择适配Ruby 2.1.5的date版本。
2. 升级Bundler版本
你当前使用的Bundler 1.7.6版本过旧,可能存在依赖解析逻辑缺陷。升级到支持Ruby 2.1的最新Bundler版本(如1.17.3):
gem install bundler -v 1.17.3
之后重新执行bundle update。
3. 清理Bundler缓存
缓存可能导致依赖解析异常,清理后重新安装:
bundle clean --force bundle install
4. 排查间接依赖
部分gem更新后可能间接引入date 3.x,用以下命令查看完整依赖树,找到关联的gem并锁定其版本:
bundle show --tree
搜索输出中的date,定位到依赖它的上游gem,在Gemfile中限制该gem的版本范围,避免拉取依赖高版本date的版本。
内容的提问来源于stack exchange,提问作者Greg Borbonus
相关产品推荐
相关产品推荐

