19

我刚刚开始阅读 Michael Hartl 的 ruby​​.railstutorial.org 书,并且一直在学习第一章。我正在使用 mac book OS X、终端和 Sublime Text。一切都按计划进行,直到测试部署到 Heroku。我能够连接到 Heroku 并运行$ git push heroku主命令。但部署失败:

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 --without production

我知道有些人建议只安装 PG 并使用它,但我真的想尽可能地坚持本教程,然后再冒险尝试不同的方法。

我现在有点迷茫,不知道如何从这里开始。您可以提供的任何帮助将不胜感激。

谢谢

4

6 回答 6

25

无论出于何种原因,Heroku 都无法安装 sqlite3 gem。但是你可以bundler说它不应该尝试,除非在开发时。

在您的Gemfile中,替换gem 'sqlite3'为:

group :development, :test do
  gem 'sqlite3'
end
group :production do
  gem 'pg'
end

然后在 heroku 上运行的 bundlerproduction不会尝试安装它。

于 2012-10-26T08:31:54.753 回答
14

我终于能够成功部署到 Heroku。感谢 evanc3 将我指向 Heroku 网站上的一篇文章。看来我只是忘记在部署到 Heroku 之前提交我的 Gemgile 更新。因此,对于所有刚起步的人,您需要确保在部署到 Heroku 之前提交您的更改。

于 2012-10-26T17:58:24.820 回答
11

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 将使用pggem,因为 heroku 在生产环境中运行您的应用程序

于 2015-06-23T18:06:08.090 回答
1

在 Heroku 上,您的应用程序无权访问文件系统。造成这种情况的原因有很多 - 基本上是因为您可以通过添加新实例(即一次运行多个服务器)来扩展应用程序的性能,并且不能保证这些实例在同一物理机器上 - 复制跨越的文件会非常慢。

SQLite 只是将数据库存储到您的 db/ 文件夹中的一个文件中,这就是它与 Heroku 不兼容的原因。

正如帮助链接中所建议的那样,最好的选择是远离 SQLite,因为 SQLite 和 PostgreSQL(Heroku 的首选数据库)之间有时存在细微的不兼容性,您希望在部署到生产之前找出这一点!

安装 PostgreSQL 后(具体如何执行取决于您的操作系统),然后添加gem 'pg'到您的 Gemfile。

于 2012-10-26T08:49:17.817 回答
0

在 Rails 教程中,他们让您sqlite3在开发和pg生产中使用。heroku 部署可能失败的一个原因是,如果您production在 heroku 上的部署仍然引用sqlite您的database.yml而不是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
于 2021-08-02T20:54:51.000 回答
0

如果您的 gemfile 中没有直接包含 sqlite3 并且您仍然收到此错误,我有一个解决方案。

最有可能的是,您有一个使用 sqlite3 作为依赖项的 gem,并且它在您不知道的情况下包含了 gem。

1) 转到 Gemfile.lock 并搜索 sqlite。

2) 找到使用 sqlite 的 gem,然后将 gem 移动到开发或测试组。

3) 捆绑

于 2016-05-18T20:01:26.087 回答