2011-12-20 37 views
3

我这个克隆回购:的JRuby与西纳特拉在Heroku

https://github.com/freeformz/sinatra-jruby-heroku.git

,试图在Heroku上的雪松堆栈使用的JRuby /西纳特拉。我按照包含的说明进行操作,并且所有内容都以“工头启动”在本地运行。然后我混帐推到Heroku的,它最初加载了罚款,但是当我尝试访问该网站,我得到在日志中的错误:

jruby: No such file or directory -- trinidad (LoadError) 

如此看来JRuby中无法找到“/app/.gems/bin/trinidad“文件。我最初以为它不在那里,因为.gems /在.gitignore文件中,但我很肯定Heroku在git push上创建了服务器端。

$ APPDIR/.gems被添加到PATH,所以Heroku应该能够看到特立尼达脚本。我也试着改变Procfile来玩类似的路径:

web: script/jruby -S bin/trinidad -p $PORT 

但是没有骰子。有没有人成功地将任何JRuby部署到Heroku雪松?

感谢

回答

4

从Bundler 1.2开始,您现在可以在您的Gemfile中使用specify the Ruby implementation and version。关于这一点的好处是Heroku会理解这些设置并为您的环境准备好您的Heroku应用程序。

拿这个Gemfile例如:

source "https://rubygems.org" 

ruby "1.9.3" 

gem "rails" 
gem "puma" 

什么是酷的,这是在默认情况下青瓷雪松使用了Ruby 1.9.2。但是,当您在Gemfile中指定ruby "1.9.3"时,它实际上会为您的Heroku环境编译Ruby 1.9.3。现在

,如果你想要一个不同的Ruby实现添加到您的Heroku的环境,你可以这样做是这样的:

source "https://rubygems.org" 

ruby "1.9.3", :engine => "jruby", :engine_version => "1.7.0.preview1" 

gem "rails" 
gem "puma" 

现在,它会安装和红宝石1使用JRuby的1.7.0.preview1 。9模式为你的Heroku应用程序部署。它甚至会在Heroku环境变量中定义适当的JVM选项。

最重要的是,这是官方的Heroku buildpack,所以不需要切换到第三方buildpack让JRuby/JVM继续使用Heroku。虽然我还没有得到它的工作,但这个should also work with Rubinius,但我相信它目前被窃听。要么,要么我做错了。

这在我看来是一个很棒的可扩展功能。只需定义您在Gemfile中使用的Ruby实现/版本/模式以及其他依赖项,Heroku将确保环境已准备就绪。


现在,这一切都在地方,Heroku上应该创造APP_ROOT/bin binstubs(通过捆扎机),你可以这样做的是例如这样的:

web: bin/trinidad -p $PORT -e $RACK_ENV --threaded 

只要不使用bundle exec以来的JRuby对此并不好。始终使用Bundler提供的binstubs,它们始终位于Heroku上的APP_ROOT/bin

0

我怀疑你的宝石是不是/app/.gems而是/app/vendor/bundle

您可以通过运行此命令找到:

heroku run ls /app/.gem 
heroku run ls /app/vendor/bundle 

无论采用哪种方式,您都应该将GEM_HOME/bin添加到路径中,而不是像您声明的那样添加GEM_HOME。

我有一个博客帖子上在Heroku上运行JRuby和特立尼达这里: http://deployingjruby.blogspot.com/2012/03/deploying-with-trinidad-on-heroku.html

和示例应用程序的位置: https://github.com/jkutner/jruby-trinidad-heroku

一些你可能会发现其他的材料是一点点出来的日期。