【发布时间】:2020-03-28 02:19:57
【问题描述】:
TL;DR:下面是一个悲惨的故事,讲述了我如何失去大约 8 个小时的生命,因为不同的 gem 正在寻找不存在的不同版本的 openssl。在来这里寻求帮助并写下我尝试过的所有内容的过程中,我设法实现了可以想象的最骇人听闻的修复,此时我必须重新开始实际工作。但是由于我在下面概述的原因,这个解决方案似乎完全不够。所以我在问:有没有为 ruby gem 指定系统依赖项的正确方法?
====我原来的问题============
我在周末 rvm installedruby 2.6.0 并且由于某种原因这触发了自制程序将我的 Mac 上的 openssl 更新为 openssl@1.1。我现在无法运行我工作的 Rails 应用程序(运行 5.1.7、ruby 2.4.0),因为我收到此错误:
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)
这个 SO 帖子中描述了基本上相同的错误:
rake db:migrate error with mysql2 gem - Library not loaded: libssl.1.0.0.dylib
那里的一些解决方案建议为您的 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)
想知道问题是否与捆绑程序有关,我运行gem uninstall mysql2,并检查这实际上删除了目录/Rob.rvm/gems/ruby-2.4.0/gems/mysql2-0.5.3/。然后尝试,按照https://bundler.io/v2.0/man/bundle-config.1.html:
bundle config build.mysql2 --with-cppflags=-I/usr/local/opt/openssl@1.1/include --with-ldflags=-L/usr/local/opt/openssl@1.1/lib
bundle install
bundle exec rails t
但我仍然遇到同样的错误,这让我怀疑这种对 v.1.0 的依赖是否以某种方式被硬编码。
我尝试降级 openssl 版本。我试图用自制软件来做到这一点,但只能看到新版本。我用谷歌搜索并使用了来自https://github.com/kelaberetiv/TagUI/issues/86 的脚本 结果是现在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 install openssl 来重置。
======修复======================================== ===
然而,今天早上我试图重现这最后一步,结果一团糟,正是在解开这个混乱的过程中,我解决了我的问题。当我尝试运行brew uninstall 时,我收到了类似1.0.2t is already installed 的消息。我更新了我的定位数据库,发现我实际上安装了 1.0.2 和 @1.1(大概是在昨天尝试之后,但 mysql2 正在查找与 @1.1 符号链接的目录。将符号链接更改为 1.0.2,我现在可以运行我的测试。
但这太糟糕了。我无法知道是否有其他 gem 会在 v1.1 的符号链接中查找。感觉应该有一种系统化的方式来指定 gem 的系统依赖关系——或者告诉 gem 使用哪个版本,或者至少是同时运行多个版本并告诉 gem 在哪里找到它需要的版本的正确方法。我怎样才能正确地做到这一点?
编辑以回应评论:这是我的 gemfile:
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]
【问题讨论】: