管理ruby gems的系统依赖项(例如mysql2和openssl)

管理ruby gems的系统依赖项(例如mysql2和openssl),ruby,openssl,rubygems,Ruby,Openssl,Rubygems,TL;DR:下面是一个悲惨的故事,讲述了我是如何因为不同的gems寻找不同版本的openssl而失去了大约8个小时的生命的。在来这里寻求帮助和写下我尝试过的所有东西的过程中,我成功地实现了想象得到的最黑客的修复,在这一点上,我必须重新开始实际的工作。但这个解决方案似乎完全不够,原因我在下面概述。所以我要问:有没有一种合适的方法来指定ruby gem的系统依赖关系 我原来的问题=========== 我在周末安装了ruby 2.6.0,出于某种原因,这触发了homebrew将Mac上的openss

TL;DR:下面是一个悲惨的故事,讲述了我是如何因为不同的gems寻找不同版本的openssl而失去了大约8个小时的生命的。在来这里寻求帮助和写下我尝试过的所有东西的过程中,我成功地实现了想象得到的最黑客的修复,在这一点上,我必须重新开始实际的工作。但这个解决方案似乎完全不够,原因我在下面概述。所以我要问:有没有一种合适的方法来指定ruby gem的系统依赖关系

我原来的问题===========

我在周末安装了ruby 2.6.0,出于某种原因,这触发了homebrew将Mac上的openssl更新为openssl@1.1. 我现在无法运行运行5.1.7和ruby 2.4.0的Rails应用程序,因为我遇到以下错误:

Roberts-MBP:website-upgrade Rob$ rails t
/Rob.rvm/gems/ruby-2.4.0/gems/mysql2-0.5.2/lib/mysql2.rb:33:in `require': dlopen(/Rob.rvm/gems/ruby-2.4.0/gems/mysql2-0.5.2/lib/mysql2/mysql2.bundle, 9): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /usr/local/opt/mysql/lib/libmysqlclient.20.dylib
  Reason: image not found - /Rob.rvm/gems/ruby-2.4.0/gems/mysql2-0.5.2/lib/mysql2/mysql2.bundle (LoadError)
这篇文章中描述了基本相同的错误:

那里的一些解决方案建议将符号链接到您的openSSL安装,或者将文件复制到它想要的位置。这对我不起作用;似乎旧1.0.x和新1.1版本的库不兼容

简单地卸载和重新安装mysql gem,我也会遇到同样的错误。 根据该帖子的另一个建议,我尝试:

Roberts-MBP:website-upgrade Rob$ gem install mysql2 -- with-cppflags=-I/usr/local/opt/openssl@1.1/include --with-ldflags=-L/usr/local/opt/openssl@1.1/lib
Fetching: mysql2-0.5.3.gem (100%)
Building native extensions with: 'with-cppflags=-I/usr/local/opt/openssl@1.1/include --with-ldflags=-L/usr/local/opt/openssl@1.1/lib'
This could take a while...
Successfully installed mysql2-0.5.3
Parsing documentation for mysql2-0.5.3
Installing ri documentation for mysql2-0.5.3
Done installing documentation for mysql2 after 0 seconds
1 gem installed
Roberts-MBP:website-upgrade Rob$ rails t
Could not find mysql2-0.5.2 in any of the sources
Run `bundle install` to install missing gems.
注意到此处的mysql版本不匹配,我删除了我的Gemfile.lock并尝试再次运行测试:

Roberts-MBP:website-upgrade Rob$ rails t
Roberts-MBP:website-upgrade Rob$ /Rob.rvm/gems/ruby-2.4.0/gems/mysql2-0.5.3/lib/mysql2.rb:36:in `require': dlopen(/Rob.rvm/gems/ruby-2.4.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle, 9): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /usr/local/opt/mysql/lib/libmysqlclient.20.dylib
  Reason: image not found - /Rob.rvm/gems/ruby-2.4.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle (LoadError)
考虑到问题是否与bundler有关,我运行了gem卸载mysql2,并检查了它是否确实删除了目录/Rob.rvm/gems/ruby-2.4.0/gems/mysql2-0.5.3/。然后,根据以下内容进行了尝试:

但我仍然会遇到同样的错误,这让我想知道对v.1.0的依赖是否是硬编码的

我尝试降级openssl版本。我试着用自制软件做这件事,但只能看到新版本。我在谷歌上搜索并使用了 结果是,现在的spring抱怨说它找不到图书馆openssl@1.1.

Roberts-MBP:website-upgrade Rob$ rails t
/Rob.rvm/gems/ruby-2.4.0/gems/spring-2.1.0/lib/spring/env.rb:3:in `require': dlopen(/Rob.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/x86_64-darwin18/digest/md5.bundle, 9): Library not loaded: /usr/local/opt/openssl@1.1/lib/libcrypto.1.1.dylib (LoadError)
  Referenced from: /Rob.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/x86_64-darwin18/digest/md5.bundle
我运行brew安装openssl进行重置

=======修复==========================================

然而,今天早上我试图重现这最后一步,结果弄得一团糟,正是在解开这团乱麻的过程中,我解决了我的问题。当我尝试运行brew uninstall时,我收到消息说1.0.2t已经安装。我更新了我的locate数据库,发现在昨天尝试了这个之后,我实际上已经安装了1.0.2和@1.1,但mysql2正在查找与@1.1对应的symlinked目录。将符号链接更改为1.0.2,我现在可以运行测试了

但这太可怕了。我无法知道是否有其他宝石会在v1.1的符号链接中寻找。感觉上应该有一种系统化的方法来指定gem的系统依赖关系——要么告诉gem使用哪个版本,要么至少有一种正确的方法来同时运行多个版本,并告诉gem在哪里找到它需要的版本。我怎样才能正确地做到这一点

编辑以回应评论:这是我的文件:

source 'https://rubygems.org'

ruby '2.4.0'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end

gem 'rails', '~> 5.1.2'
gem 'postmark-rails', '~> 0.15.0'
gem 'mysql2'
gem 'passenger', '= 5.1.5'
gem 'jbuilder', '~> 2.5'
gem 'jquery-rails'
gem 'figaro'
gem 'fastercsv', '~> 1.5', '>= 1.5.5'
gem 'jwt'
gem 'rack-cors'
gem 'rest-client'
gem 'sentry-raven'
gem 'activerecord-session_store'
gem 'timecop'
gem 'webpacker', '~> 3.5'
gem 'write_xlsx'

gem 'pry-rails'

gem 'ddtrace'

group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'capybara', '~> 2.13'
  gem 'selenium-webdriver'
  gem 'minitest', '5.10.3'
end

group :development do

  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'

  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]



我看过这个rvm项目,在那里你可以找到更多关于这个的细节

这一步对我有效,我们必须等待一些官方的修正

通过rvm pkg安装openssl安装openssl 使用rvm重新安装2.6.0移除并重新安装红宝石 -使用openssl dir=$HOME/.rvm/usr 我看过这个rvm项目,在那里你可以找到更多关于这个的细节

这一步对我有效,我们必须等待一些官方的修正

通过rvm pkg安装openssl安装openssl 使用rvm重新安装2.6.0移除并重新安装红宝石 -使用openssl dir=$HOME/.rvm/usr
您能发布Gemfile的内容以便人们可以尝试复制吗?@Olly完成,谢谢您能发布Gemfile的内容以便人们可以尝试复制吗?@Olly完成,谢谢
source 'https://rubygems.org'

ruby '2.4.0'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end

gem 'rails', '~> 5.1.2'
gem 'postmark-rails', '~> 0.15.0'
gem 'mysql2'
gem 'passenger', '= 5.1.5'
gem 'jbuilder', '~> 2.5'
gem 'jquery-rails'
gem 'figaro'
gem 'fastercsv', '~> 1.5', '>= 1.5.5'
gem 'jwt'
gem 'rack-cors'
gem 'rest-client'
gem 'sentry-raven'
gem 'activerecord-session_store'
gem 'timecop'
gem 'webpacker', '~> 3.5'
gem 'write_xlsx'

gem 'pry-rails'

gem 'ddtrace'

group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'capybara', '~> 2.13'
  gem 'selenium-webdriver'
  gem 'minitest', '5.10.3'
end

group :development do

  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'

  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]