在Heroku上需要jruby pg时无需加载此类文件

时间:2015-09-12 16:26:19

标签: ruby heroku bundle jruby pg

我希望在jRuby应用程序中使用jRuby pg gem。 gem在本地运行正常,但在heroku上运行时无法加载pg gem。

LoadError: no such file to load -- pg
  require at org/jruby/RubyKernel.java:1071
  require at /app/vendor/ruby-1.9.3-jruby-1.7.19/lib/ruby/shared/rubygems/core_ext/kernel_require.rb:54
   (root) at text.rb:19

我的Gemfile是:

ruby '1.9.3', :engine => 'jruby', :engine_version => '1.7.19'
gem 'pg', '0.17.1', :platform => :jruby, :git => 'git://github.com/headius/jruby-pg.git', :branch => :master

Heroku bundle show返回:

Gems included by the bundle:
 * pg (0.17.1 c236a38)

Heroku ruby -v返回:

jruby 1.7.19 (1.9.3p551) 2015-02-06 fffffff on OpenJDK 64-Bit Server VM 1.8.0_60-cedar14-b24 +jit [linux-amd64]

text.rb包含:

require 'rubygems'
require 'pg'
puts "cool!"

到目前为止,我有:

  • 在本地运行捆绑并重新推送
  • 在本地运行捆绑包并重新安装
  • 清除了Gemfile.lock,然后在heroku上运行bundle
  • 更新了heroku toolbelt
  • 更新了ruby gems
  • 检查我是否在本地和heroku上运行相同版本的jruby
  • 卸载了pg gem并重新安装
  • text.rb文件中需要的rubygems
  • 在heroku上需要pg.rb的绝对路径,这导致无法加载pg_ext错误

1 个答案:

答案 0 :(得分:2)

为了实现这一点,您需要在Procfile命令前添加bundle exec作为前缀(因为它是非标准宝石,Heroku无法将其置于其中在路径上自动)。

例如:

test: bundle exec ruby text.rb

但是,这会给你的JRuby启动时间增加一些开销,因为Bundler必须启动两个JRuby进程(一个用于自身,然后另一个用正确的gem上下文)。

另一个选择是使用更广泛采用的activerecord-jdbcpostgresql-adapter