由于 sqlite3 gem 错误,Heroku 部署失败
Posted
技术标签:
【中文标题】由于 sqlite3 gem 错误,Heroku 部署失败【英文标题】:Heroku deployment failed because of sqlite3 gem error 【发布时间】:2012-10-16 12:15:43 【问题描述】:我刚刚开始阅读 Michael Hartl 的 ruby.railstutorial.org 书,并且一直在阅读第一章。我正在使用 mac book OS X、终端和 Sublime Text。一切都按计划进行,直到测试部署到 Heroku。我能够连接到 Heroku 并运行 $ git push heroku
master 命令。但是部署失败:
Installing sqlite3 (1.3.5) with native extensions
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.
/usr/local/bin/ruby extconf.rb
checking for sqlite3.h... no
sqlite3.h is missing. Try 'port install sqlite3 +universal'
or 'yum install sqlite-devel' and check your shared library search path (the
location where your sqlite3 shared library is located).
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.
Provided configuration options:
An error occurred while installing sqlite3 (1.3.5), and Bundler cannot continue.
Make sure that `gem install sqlite3 -v '1.3.5'` succeeds before bundling.
!
! Failed to install gems via Bundler.
!
! Detected sqlite3 gem which is not supported on Heroku.
! http://devcenter.heroku.com/articles/how-do-i-use-sqlite3-for-development
!
! Heroku push rejected, failed to compile Ruby/rails app
这是我的 Gemfile
source 'https://rubygems.org'
gem 'rails', '3.2.8'
# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'
group :development, :test do
gem 'sqlite3', '1.3.5'
end
# Gems used only for assets and not required
# in production environments by default.
group :assets do
gem 'sass-rails', '~> 3.2.5'
gem 'coffee-rails', '~> 3.2.2'
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', :platforms => :ruby
gem 'uglifier', '>= 1.2.3'
end
gem 'jquery-rails', '2.0.2'
group :production do
gem 'pg', '0.12.2'
end
# To use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.0.0'
# To use Jbuilder templates for JSON
# gem 'jbuilder'
# Use unicorn as the app server
# gem 'unicorn'
# Deploy with Capistrano
# gem 'capistrano'
# To use debugger
# gem 'debugger'
我将 sqlite3 指定用于开发而不是生产,所以我认为 Heroku 会一起忽略它,但事实并非如此。
另外,当我创建我正在使用的包时 $ bundle install -- 不生产
我知道有些人建议只安装 PG 并使用它,但我真的想尽可能地坚持教程,然后再冒险尝试不同的方法。
我现在有点迷茫,不知道如何从这里开始。您可以提供的任何帮助将不胜感激。
谢谢
【问题讨论】:
哇,那个帮助链接比我遇到这个问题时更无用...... 按照链接的建议使用 PostgreSQL。 查看本栏目devcenter.heroku.com/articles/… 好的,我看了一下文章,终于可以完成对Heroku的部署了。我明白我做错了什么。在将更新的文件部署到 Heroku 之前,我没有提交我的更改。菜鸟失误! 感谢您对提交更改的评论 :),可能为我节省了 15 到 20 分钟。 【参考方案1】:无论出于何种原因,Heroku 都无法安装 sqlite3 gem。但是你可以告诉bundler
,它不应该尝试,除非在开发时。
在您的 Gemfile
中,将 gem 'sqlite3'
替换为:
group :development, :test do
gem 'sqlite3'
end
group :production do
gem 'pg'
end
然后以production
运行的heroku 上的bundler 不会尝试安装它。
【讨论】:
我用代码更新了 Gemfile,并捆绑并部署到 Heroku,但我仍然遇到同样的错误。 sqlite3 的 gem 安装成功,没有生产的捆绑包也是成功的,仍然没有运气 真傻,我忘了添加pg
gem 作为替代品。现在怎么样?
我刚刚将我的 Gmgfile 添加到我的问题中。我将 sqlite 标记为开发,将 PG 标记为生产 - 但尝试部署到 Heroku 时仍然出现相同的错误。【参考方案2】:
在 Heroku 上,您的应用无权访问文件系统。造成这种情况的原因有很多 - 基本上是因为您可以通过添加新实例(即一次运行多个服务器)来扩展应用程序的性能,并且不能保证这些实例在同一物理机器上 - 复制跨过的文件会非常慢。
SQLite 只是将数据库存储到您的 db/ 文件夹中的一个文件中,这就是它与 Heroku 不兼容的原因。
如帮助链接中所建议的,最好的选择是远离 SQLite,因为 SQLite 和 PostgreSQL(Heroku 的首选数据库)之间有时存在细微的不兼容性,您希望在之前发现这一点 em> 你部署到生产环境中!
安装 PostgreSQL 后(具体如何安装取决于您的操作系统),然后将 gem 'pg'
添加到您的 Gemfile。
【讨论】:
【参考方案3】:我终于能够成功部署到 Heroku。感谢 evanc3 将我指向 Heroku 网站上的一篇文章。看来我只是忘记在部署到 Heroku 之前提交我的 Gemgile 更新。因此,对于所有刚起步的人,您需要确保在部署到 Heroku 之前提交您的更改。
【讨论】:
【参考方案4】:Heroku 不支持 sqlite3...
从您的 Gemfile 中删除 sqlite3,改用 pg gem。在 gem 文件中进行以下更改
在您的Gemfile
中更改关注
gem 'sqlite3'
到
gem 'pg' #you will have to install postgresql
重要:运行
git add .
git commit
git push heroku master
注意:如果你打算为heroku部署,我建议你最好在开发阶段也使用postgres(在你的电脑上安装postgresql),heroku更喜欢psql。
如果您想使用 sqllite 进行开发,使用 postgresql 进行 Heroku,请使用以下配置。
group :development do
gem 'sqlite3' #gem to use in development environment
end
group :production do
gem 'pg' #gem to use in production environment
end
Heroku 将使用 pg
gem,因为 heroku 在生产环境中运行您的应用程序
【讨论】:
【参考方案5】:如果您的 gemfile 中没有直接包含 sqlite3 并且您仍然收到此错误,我有一个解决方案。
很可能,您有一个使用 sqlite3 作为依赖项的 gem,并且它在您不知情的情况下包含了该 gem。
1) 转到 Gemfile.lock 并搜索 sqlite。
2) 找到正在使用 sqlite 的 gem,然后将 gem 移入开发或测试组。
3) 捆绑
【讨论】:
【参考方案6】:在 Rails 教程中,他们让您在开发中使用 sqlite3
,在生产中使用 pg
。 heroku 部署可能失败的一个原因是,如果您在 heroku 上的 production
部署仍然在您的 database.yml
中引用 sqlite
而不是 postgres
。
tldr; 您的config/database.yml
应该与此处显示的匹配:
https://github.com/mhartl/sample_app_6th_ed/blob/main/config/database.yml
最重要的是你的production
配置行应该匹配这个(这样adapter: postgres
而不是adapter: sqlite3
):
production:
adapter: postgresql
encoding: unicode
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") 5 %>
database: sample_app_production
【讨论】:
以上是关于由于 sqlite3 gem 错误,Heroku 部署失败的主要内容,如果未能解决你的问题,请参考以下文章
将带有 SQLite3 的 Rails 推送到 Heroku 失败 [重复]
升级到 OS Sierra 后 Rails 出现分段错误,可能与 sqlite3 gem 有关
Gem::LoadError: 为数据库适配器指定了“sqlite3”,但未加载 gem
使用 SQLite 3 将 RoR 应用程序部署到 Heroku 失败