我正在克隆这个存储库:
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/