Rails和libpq-dev之间存在恶劣的依赖关系。

我不知道这个问题是否适合在这里提问,但我试一试。嗨。我在我的机器上运行着ubuntu 11.10双启动与windows vista。在Ubuntu上,我安装了RVM、rails gem和PostgreSQL(包括postgres服务器、客户端和其他像libpq5这样的软件包,因为我是通过软件中心安装的)。
我正在尝试在heroku上部署我的应用程序,但似乎需要安装pg gem。我尝试安装它,但却得到了以下错误:
ERROR: Failed to build gem native extension. /home/pcr/.rvm/rubies/ruby-1.9.3-p0/bin/ruby extconf.rb checking for pg_config... yes Using config values from /usr/bin/pg_config You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application. You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application. checking for libpq-fe.h... * extconf.rb failed *
在谷歌和stackoverflow上搜索了一段时间后,很多人说必须安装libpq-dev。我尝试过软件中心,但由于依赖关系无法满足而失败。我尝试使用apt-get,它说我需要libkrb5-dev和krb5-multidev。我尝试运行sudo apt-get install libpq-dev libkrb5-dev krb5-multidev命令,结果如下:
以下软件包有未满足的依赖关系:krb5-multidev: 依赖于libkrb5-3 (= 1.9.1+dfsg-1ubuntu1),但要安装的是1.9.1+dfsg-1ubuntu2.1 依赖于libk5crypto3 (= 1.9.1+dfsg-1ubuntu1),但要安装的是1.9.1+dfsg-1ubuntu2.1 依赖于libgssapi-krb5-2 (= 1.9.1+dfsg-1ubuntu1),但要安装的是1.9.1+dfsg-1ubuntu2.1 无法纠正问题,您有损坏的软件包。
但是我已经在我的系统上安装了libkrb5-3、libk5crypto3和libgssapi-krb5-2(版本均为1.9.1+dfsg-1ubuntu2.1)。我认为可能需要的版本是1.9.1+dfsg-1ubuntu1。所以,也许我必须先删除1.9.1+dfsg-1ubuntu2.1的软件包。你认为我删除它是否安全?我尝试删除其中一个,但软件中心警告我它还会删除postgres、openssl-client、smbclient、cups和许多其他软件包。
我应该怎么解决这个问题?而且,是否真的需要在我的本地机器上安装pg gem来创建使用postgres作为数据库管理系统的rails应用程序?有没有办法将包含pg gem的责任交给heroku呢?
2个回答

今天我遇到了同样的问题。我按照提示信息安装了postgresql-server-dev-X.Y来构建服务器端扩展,或者安装libpq-dev来构建客户端应用程序。 然后我重新安装了rails应用程序并且错误消失了。
$ sudo apt-get install libpq-dev
$ bundle install

2如果你想在开发机上镜像PostgreSQL,这是一个更好的解决方案,对我来说很有效。 - Collin White

真正的解决方案是,正如Amit Patel所指出的那样,安装libpq-dev
如果你无法在开发机器上设置pg,这里有一个解决办法。你可以在本地机器上使用sqlite,在Heroku上使用pg。以下是你应该在Gemfile中拥有的内容。
group :production do
  gem 'pg'
end

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

使用此命令安装 bundle 以忽略生产环境的 gems:

bundle install --without production

请记住,在生产和开发机器中没有相同的环境是不推荐的。

是的,这是正确的答案。+1,我现在经常这样做。 - jrg
@jrg 你在做这个的时候遇到了一些问题吗?我问这个是因为Heroku说“不推荐这样做”。 - PatrixCR
Heroku不推荐这样做,因为通常你希望开发环境与服务器环境相同 - 但是,只要你使用ActiveRecord或DataMapper,并且不编写原始SQL,99%的情况下都应该没问题。 :) - jrg
谢谢@jrg和Arash。我一定会试试看的。另外,如果我这样做的话,我需要相应地更改config/database.yml中的开发部分和生产部分,对吗? - PatrixCR
1@PatrixCR 不需要,Heroku会为您完成这个任务。 - jrg
我遇到了一个小问题,本地环境无法正常工作,但在Heroku上却可以。不过很容易找出问题,因为我知道数据库出了点问题。但是如果你让开发和生产之间的差距变得更大,你将会面临更多的问题。:) - Arash Badie Modiri
1使用sqlite是一种解决办法。那么,解决方案是什么呢? - Amit Patel
绝对不可能在开发过程中使用与生产环境完全不同的数据库。SQLite3和PostgreSQL在数据库方面是天壤之别。 - Brad