RVM / Heroku / Gem:懒惰符号绑定失败

时间:2013-03-01 17:05:08

标签: ruby sqlite heroku gem rvm

我无法做到这一点:

apaw:x apaw$ heroku db:pull

dyld: lazy symbol binding failed: Symbol not found: _rb_intern2
  Referenced from: /Users/apaw/.rvm/gems/ruby-1.9.3-p385/gems/sqlite3-ruby-1.3.2/lib/sqlite3/sqlite3_native.bundle
  Expected in: flat namespace

dyld: Symbol not found: _rb_intern2
  Referenced from: /Users/apaw/.rvm/gems/ruby-1.9.3-p385/gems/sqlite3-ruby-1.3.2/lib/sqlite3/sqlite3_native.bundle
  Expected in: flat namespace

我尝试了不同的sqlite3 gem版本,但它们都失败了。

在我通过rvm

安装ruby-1.9.3-p385之前,它完美运行

3 个答案:

答案 0 :(得分:4)

这可能不是您想要的答案,但我相信这是您需要的答案。

首先,假设你正在使用Heroku Postgres,你真的应该在本地使用Postgres来实现dev / production奇偶校验。开发环境和部署环境之间的奇偶性可防止由于环境之间的差异而引入细微错误。 RVM,Bundler等。人。努力在其他领域实现这一目标;我恳请您使用您的数据库。理论上,适配器抽象出支持服务(数据库,缓存系统)的任何差异。实际上,支持服务之间的差异意味着微小的不兼容性会突然出现,从而导致代码在开发或分段中工作并通过测试,从而导致生产失败。

其次,不推荐使用db:pull/push命令,您应该使用pgbackups:capture/restore。有关详情,请参阅Importing and Exporting Heroku Postgres Databases with PG Backups。处理不同的后端(postgres remote,sqlite3 local)时,db:pull非常糟糕。上面的错误是一个很好的例子。虽然使用pgbackups可以说是更多的步骤,但它更安全可靠,并且对于脚本来说应该是微不足道的。

答案 1 :(得分:3)

SQLite在平台上显式不受支持,因为文件系统为ephemeral。一旦你重新启动dynos,你写入sqlite数据库的东西就会消失。请改用heroku postgres

如果您仍希望这样做,可以分叉ruby buildpack并进行更改,以便将sqlite3库文件捆绑到您的应用程序中。用于创建自定义构建包的文档是here

答案 2 :(得分:2)

我设法通过取消heroku工具带并安装heroku gem来实现。

谢谢大家的提示