ruby - JRuby 与 Heroku 上的 Sinatra

标签 ruby heroku sinatra jruby

我正在克隆这个存储库:

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

尝试在 Heroku 的 Cedar 堆栈上使用 JRuby/Sinatra。我按照随附的说明进行操作,一切都在“工头开始”的情况下在本地运行良好。然后我 git push 到 Heroku 并且它最初加载正常但是当我尝试访问该站点时我在日志中收到错误消息:

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

看来 jruby 找不到“/app/.gems/bin/trinidad”文件。我最初认为它不存在,因为 .gems/在 .gitignore 文件中,但我很确定 Heroku 在 git push 上创建了服务器端。

$APPDIR/.gems 已添加到 PATH,因此 Heroku 应该能够看到 trinidad 脚本。我还尝试更改 Procfile 以使用如下路径:

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

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

谢谢

最佳答案

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

以这个Gemfile为例:

source "https://rubygems.org"

ruby "1.9.3"

gem "rails"
gem "puma"

Celadon Cedar 默认使用 Ruby 1.9.2,这很酷。但是,当您在 Gemfile 中指定 ruby "1.9.3" 时,它实际上会为您的 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 一起提供,因此无需切换到第 3 方构建包即可让 JRuby/JVM 在 Heroku 上运行。虽然我还没有让它工作,但这个 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 提供的 binstub,它们始终位于 Heroku 上的 APP_ROOT/bin 中。

关于ruby - JRuby 与 Heroku 上的 Sinatra,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8574699/

相关文章:

ruby-on-rails - 如何使用 HAML 保持 DRY?

ruby-on-rails - rails :Send mail using mailer when controller finishes its execution

ruby - 部署后 Capistrano 3 不重启

ruby-on-rails - 推送到heroku staging master : Valid values are "development", "test"和 "production"。相反,收到: "staging"

ruby - 如何让 Sinatra 以 HTML 形式提供 Markdown 以及以纯文本形式提供源代码?

ruby-on-rails - 如何每 x 秒执行一次方法调用?

ruby-on-rails - 在使用 RVM 的 linux mint 上运行 `bundle install` 时出现许多临时 UnknownHost 错误

javax.sound.sampled.LineUnavailableException : The system does not support the specified format

php - set_time_limit 不适用于heroku

ruby - 在生产服务器上使用 DataMapper 和 Sinatra 设置数据库的正确方法是什么?