【问题标题】:Managing system dependencies of ruby gems (e.g. mysql2 and openssl)管理 ruby​​ gem 的系统依赖项(例如 mysql2 和 openssl)
【发布时间】: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]



【问题讨论】:

    标签: ruby openssl rubygems


    【解决方案1】:

    我看过这个issue on rvm 项目,您可以在其中找到有关此的更多详细信息。

    这一步对我有用,我们必须等待一些官方修复。

    1. 通过 rvm pkg install openssl 安装 openssl
    2. 使用 rvm reinstall 2.6.0 删除并重新安装 rubies --with-openssl-dir=$HOME/.rvm/usr

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2010-11-30
      • 2017-09-24
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多