安装mysql2(0.4.8)时出现错误,Bundler无法继续。

52

我应该如何修复 Ruby on Rails 中的这个错误。

source 'https://rubygems.org'

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


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.0.2'
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
# Use Puma as the app server
gem 'puma', '~> 3.0'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby
gem 'mysql 2', '0.4.8'
# Use jquery as the JavaScript library
gem 'jquery-rails'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 3.0'
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platform: :mri
end

group :development do
  # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '~> 3.0.5'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

gem 'spree', '~> 3.2.1'
gem 'spree_auth_devise', github: 'spree/spree_auth_devise'
gem 'spree_gateway', github: 'spree/spree_gateway'
gem 'spree_i18n', github: 'spree-contrib/spree_i18n', branch: 'master'

我运行了 "bundle install" 命令后出现了这个错误。为了修复项目的错误,我在控制台中运行了 "gem install mysql2 '0.4.8'" 命令,但是我无法解决它。

这个 Ruby on Rails 使用了 Spree 框架。

编辑:

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/admin/.rvm/gems/ruby-2.4.1/gems/mysql2-0.4.8/ext/mysql2
/Users/admin/.rvm/rubies/ruby-2.4.1/bin/ruby -r ./siteconf20170803-6579-foq4sg.rb extconf.rb
checking for rb_absint_size()... yes

我运行了 'bundle install' 命令,但由于出现以下错误,无法成功执行该命令。


1
如果您添加bundle error将会很有用。 - Sebastián Palma
请查看 https://github.com/bundler/bundler/issues/3372#issuecomment-94488866,相关编程内容。 - Abdullah
12个回答

119

我认为你缺少了mysql的dev库:

在Ubuntu上

sudo apt-get install libmysqlclient-dev

在使用 yum 的 Red Hat/CentOS 和其他发行版上:

sudo yum install mysql-devel

在Mac OS X上使用Homebrew:

brew install mysql

3
谢谢您的回答。在 Mac OS 上,我运行了命令“brew install mysql”,然后运行了“bundle install”。现在没有错误了。 - user8387785
2
现在是 sudo apt-get install default-libmysqlclient-dev - Francisco Cabral
2
我正在使用Mac Big Sur,但仍然遇到错误。 - Giridharan
Debian/Ubuntu软件包名称已更改,应该现在使用 sudo apt-get install libmariadb-dev-compat libmariadb-dev - Tony Hsieh
在Windows上呢? - Mladen Oršolić
显示剩余2条评论

48

我在Mac上遇到了OpenSSL问题。

An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.

我使用以下命令解决了这个问题:

$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"

sudo bundle install

控制台结果:

Fetching mysql2 0.5.2
Installing mysql2 0.5.2 with native extensions
Using puma 3.12.0
Using sprockets 3.7.2
Using sprockets-rails 3.2.1
Fetching rails 5.2.2.1
Installing rails 5.2.2.1
Using rubyzip 1.2.2
Using sass-listen 4.0.0
Using sass 3.7.3
Using tilt 2.0.9
Using sass-rails 5.0.7
Using selenium-webdriver 3.141.0
Using spring 2.0.2
Using spring-watcher-listen 2.0.1
Using turbolinks-source 5.2.0
Using turbolinks 5.2.0
Using uglifier 4.1.20
Using web-console 3.7.0
Bundle complete! 18 Gemfile dependencies, 79 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

替代方案

如果您仍然遇到错误,并在控制台中收到以下消息:You are replacing the current local value of build.mysql2, which is currently nil。请尝试以下方法:

export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"

然后运行:

$ sudo gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/' -- --with-cppflags=-I/usr/local/opt/openssl/include --with-ldflags=-L/usr/local/opt/openssl/lib

显示结果:

Building native extensions with: '--with-cppflags=-I/usr/local/opt/openssl/include --with-ldflags=-L/usr/local/opt/openssl/lib'
This could take a while...
Successfully installed mysql2-0.5.2
Parsing documentation for mysql2-0.5.2
Installing ri documentation for mysql2-0.5.2
Done installing documentation for mysql2 after 0 seconds
1 gem installed

最后,在项目中运行bundle install:

$ sudo bundle install

如果这能解决你的问题,请告诉我!!! :)


1
这个对我有用!谢谢你,善良的陌生人。 - greenymaster69
100%绝对没有什么我尝试过的可以解决我的问题。最好的部分是,运行gem list会列出许多宝石,包括安装了mysql2(0.5.2)...... 我快疯了。 - brian-welch

29

如果您使用的是Mac电脑,请确保先安装了OpenSSL。

brew install openssl

然后导出

$ export LDFLAGS="-L/usr/local/opt/openssl/lib"
$ export CPPFLAGS="-I/usr/local/opt/openssl/include"

请确保您已经安装了MySQL

gem install mysql2 -v '0.5.3' \
  --source 'https://rubygems.org/' -- \
  --with-cppflags=-I/usr/local/opt/openssl/include \
  --with-ldflags=-L/usr/local/opt/openssl/lib

然后运行bundle

bundle install

我差点因为买了新机器而忘记需要安装 OpenSSL 而把剩下的头发都掉光了。


我遇到了同样的问题,上述方法解决了它。然而,我不需要以sudo身份运行gem install mysql2,因此似乎没有必要通过这种方式来解决错误。 - Fralcon
2
谢谢,这里省了些烦恼。 - Igor
1
愚蠢的提示:请将“_gem version_”替换为您打算安装的版本 :) - fguillen

4
以下命令可以帮助您解决问题:
 sudo apt-get install libmysqlclient-dev

4

MacOS Monterey (M1)

Homebrew中的libinclude文件的位置已更改。我使用这个指南来设置正确的安装路径。

我首先使用此过程刷新了我的Ruby和Rails安装。这将安装openssl依赖项。

$ export LIBRARY_PATH=$LIBRARY_PATH:$(brew --prefix openssl@1.1)/lib/

在仔细检查了我的mysql安装后,我在构建过程中遇到了最终的障碍:zstd。我使用以下方法解决了这个问题(感谢这个答案):

 bundle config --local build.mysql2 \
   "--with-ldflags=-L/opt/homebrew/Cellar/zstd/1.5.0/lib"

现在你可以再次运行bundle了。

 bundle install

3

针对使用 macOS Monterey (M1 Pro/Max) 的用户,我找到了一个简单而快速的解决方案:

将其复制并粘贴到您的终端中。

arch -x86_64 gem install mysql2 -v 0.5.3 -- --srcdir=/usr/local/mysql/include

现在您可以运行bundle而不会出现任何MySql错误。


1
非常容易和简单。对我来说很有效。非常感谢。 - Nguyễn Viết Thái

3

我使用的是 macOS Monterey,这个方法对我有效:

gem install mysql2 -- --srcdir=/usr/local/mysql/include

1
我找到了使用Homebrew安装的MySQL路径,并运行了以下命令:
gem install mysql2 -- \
 --with-mysql-lib=/opt/homebrew/Cellar/mysql/8.0.27/lib \
 --with-mysql-dir=/opt/homebrew/Cellar/mysql/8.0.27 \
 --with-mysql-config=/opt/homebrew/Cellar/mysql/8.0.27/bin/mysql_config \
 --with-mysql-include=/opt/homebrew/Cellar/mysql/8.0.27/include 

将路径更改为您的mysql路径,这样问题就可以解决了。


1

1

我遇到了类似的问题,但是针对的是v4.10

Error occurred while installing mysql2 (0.4.10), and Bundler cannot continue

因此我不得不运行以下命令来解决上述问题。

sudo apt-get update
sudo apt-get install build-essential

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接