使用Whenever管理Cron部署报错:库版本不兼容
问题描述
我们使用Whenever工具管理Cron任务,近期部署时触发如下错误:
4: from /var/www/sites/opencaseware-prod/shared/bundle/ruby/2.7.0/gems/chronic-0.10.2/lib/chronic.rb:1:in `require' 3: from /usr/lib/ruby/2.7.0/time.rb:3:in `<top (required)>' 2: from /usr/lib/ruby/2.7.0/time.rb:3:in `require' 1: from /var/www/sites/opencaseware-prod/shared/bundle/ruby/2.7.0/gems/date-3.3.3/lib/date.rb:4:in `<top (required)>' /var/www/sites/opencaseware-prod/shared/bundle/ruby/2.7.0/gems/date-3.3.3/lib/date.rb:4:in `require': incompatible library version - /var/www/sites/opencaseware-prod/shared/bundle/ruby/2.7.0/gems/date-3.3.3/lib/date_core.so (LoadError)
运行环境:Ruby 2.7.6、Rails 5.2、Ubuntu 18.10
解决方案
清理重建Gem依赖
删除缓存的依赖包,重新安装确保本地扩展和系统环境匹配:bundle clean --force rm -rf vendor/bundle bundle install --deployment先确认当前终端使用的Ruby版本是2.7.6(用
ruby -v检查),如果用rbenv/rvm,切换到对应版本后再执行。锁定date gem到兼容版本
Ruby 2.7.x自带的date gem版本和3.3.3存在兼容性冲突,在Gemfile中添加锁定:gem 'date', '~> 2.0.0'执行
bundle install后,这个版本是Ruby 2.7原生适配的,不会出现扩展库版本不兼容问题。修复系统依赖并重新编译扩展
Ubuntu 18.10的系统库较旧,先安装Ruby编译所需依赖:sudo apt-get update sudo apt-get install ruby-dev build-essential libssl-dev libreadline-dev zlib1g-dev然后重新编译date gem的本地扩展:
bundle exec gem uninstall date bundle exec gem install date -v 3.3.3 --platform=ruby对齐Whenever的执行环境
确保Cron任务使用的Ruby环境和应用一致,在config/schedule.rb开头指定路径:env :PATH, ENV['PATH'] set :ruby_path, '/usr/local/rbenv/versions/2.7.6/bin/ruby' # 替换成你的Ruby实际路径重新生成Cron任务:
bundle exec whenever --update-crontab
内容的提问来源于stack exchange,提问作者user1130176
相关产品推荐
相关产品推荐

