由于 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 失败

heroku 上的 therubyracer 错误为“无法通过 Bundler 安装 gems”。

Heroku推送失败并出现关于sqlite3的错误[重复]