JRuby和Heroku上的Sinatra

时间:2011-12-20 11:27:23

标签: ruby heroku sinatra jruby

我正在克隆这个回购:

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

尝试在Heroku的Cedar堆栈上使用JRuby / Sinatra。我遵循所包含的说明,一切都在本地运行,并带有“工头开始”。我然后git推送到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雪松?

由于

3 个答案:

答案 0 :(得分:4)

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

Gemfile为例:

source "https://rubygems.org"

ruby "1.9.3"

gem "rails"
gem "puma"

这有什么好处,默认情况下,Celadon Cedar默认使用Ruby 1.9.2。但是,当您在ruby "1.9.3"中指定Gemfile时,它实际上会为您的Heroku环境编译Ruby 1.9.3。

现在,如果您想为Heroku环境添加不同的Ruby实现,可以这样做:

source "https://rubygems.org"

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

gem "rails"
gem "puma"

现在,它将在部署时为您的Heroku应用程序在Ruby 1.9模式下安装和使用JRuby 1.7.0.preview1。它甚至还会在Heroku环境变量中定义正确的JVM选项。

最重要的是,这是官方的Heroku buildpack,所以没有必要切换到第三方buildpack来让Herub上的JRuby / JVM运行。虽然我还没有开始工作,但是should also work with Rubinius,但我相信它目前已被窃听。不管怎样,或者我做错了。

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


现在,完成所有这些后,Heroku应该在APP_ROOT/bin中创建binstub(通过Bundler),所以你可以做的就是这样:

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

只是不要使用bundle exec因为JRuby不能很好地使用它。始终使用Bundler提供的binstubs,它总是位于Heroku上的APP_ROOT/bin

答案 1 :(得分:0)

我相信在此博客条目中包含宝石的详细信息可能对您有所帮助:

http://chris.chowie.net/2011/08/28/Sinatra-with-JRuby-on-Heroku/

答案 2 :(得分:0)

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

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

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

无论哪种方式,您都应该将GEM_HOME / bin添加到路径中,而不是在您声明时添加GEM_HOME。

我有一篇关于在Heroku上运行Jruby和Trinidad的博文: http://deployingjruby.blogspot.com/2012/03/deploying-with-trinidad-on-heroku.html

这里有一个示例应用: https://github.com/jkutner/jruby-trinidad-heroku

您可能会发现其他一些材料有点过时了。