将 sinatra 应用程序部署到 heroku 时出现神秘错误:bundler: failed to load command: rackup
Mysterious error deploying sinatra app to heroku: bundler: failed to load command: rackup
我注意到在我部署我的 sinatra 应用程序时,heroku 产生了一个神秘的错误。它在本地运行良好,事实上,它在 heroku 上也运行良好——但每次部署时(并且仅在部署时),heroku 日志中都会出现此错误:
2017-04-26T08:52:25.579045+00:00 app[web.1]: bundler: failed to load command: rackup (/app/vendor/bundle/ruby/2.3.0/bin/rackup)
2017-04-26T08:52:25.579176+00:00 app[web.1]: RuntimeError: missing run or map statement
2017-04-26T08:52:25.579178+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/builder.rb:146:in `to_app'
2017-04-26T08:52:25.579179+00:00 app[web.1]: /app/config.ru:5:in `<main>'
2017-04-26T08:52:25.579180+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/builder.rb:49:in `eval'
2017-04-26T08:52:25.579180+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/builder.rb:49:in `new_from_string'
2017-04-26T08:52:25.579181+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/builder.rb:40:in `parse_file'
2017-04-26T08:52:25.579182+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/server.rb:299:in `build_app_and_options_from_config'
2017-04-26T08:52:25.579183+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/server.rb:208:in `app'
2017-04-26T08:52:25.579184+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/server.rb:336:in `wrapped_app'
2017-04-26T08:52:25.579184+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/server.rb:272:in `start'
2017-04-26T08:52:25.579185+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/server.rb:147:in `start'
2017-04-26T08:52:25.579186+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/bin/rackup:4:in `<top (required)>'
2017-04-26T08:52:25.579187+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/bin/rackup:23:in `load'
2017-04-26T08:52:25.579215+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/bin/rackup:23:in `<top (required)>'
2017-04-26T08:52:25.724981+00:00 heroku[web.1]: Process exited with status 1
2017-04-26T08:52:26.928566+00:00 heroku[web.1]: Starting process with command `bundle exec rackup config.ru -p 56963`
2017-04-26T08:52:29.278571+00:00 app[web.1]: [2017-04-26 08:52:29] INFO WEBrick 1.3.1
2017-04-26T08:52:29.278590+00:00 app[web.1]: [2017-04-26 08:52:29] INFO ruby 2.3.1 (2016-04-26) [x86_64-linux]
2017-04-26T08:52:29.278909+00:00 app[web.1]: == Sinatra (v1.4.8) has taken the stage on 56963 for production with backup from WEBrick
2017-04-26T08:52:29.279274+00:00 app[web.1]: [2017-04-26 08:52:29] INFO WEBrick::HTTPServer#start: pid=4 port=56963
2017-04-26T08:52:29.825875+00:00 heroku[web.1]: State changed from starting to up
其他帖子表明这可能是由于 config.ru
中的一个错误。我的仅包含:
require './lib/app'
SinatraApp.run!
这是我的 Procfile
:
web: bundle exec rackup config.ru -p $PORT
heroku deploy log is here,以防有帮助。正如我所说,该应用程序似乎运行良好(您可以在上述记录的末尾看到它成功启动),但我不明白是什么导致了每次部署时出现此错误。
谢谢。
你在混淆 Rack’s run
method with Sinatra’s run!
method。
当使用 rackup
时,Rack 期望您的 config.ru
指定您想要 运行 的应用程序。您可以使用 run
(或 map
)方法执行此操作。你的 config.ru
没有这些,所以当 rackup
运行 时它报告你看到的错误:missing run or map statement
.
Sinatra 有自己的 run!
方法。当您调用此方法时,Sinatra 将启动网络服务器并为您的应用程序提供服务。该服务器将遵守各种 Sinatra 设置(例如 set :server, 'puma'
等)。 rackup
不使用此设置。 (我怀疑你的应用程序中有类似 set :port, ENV['PORT']
的行)。
您的 config.ru
应该看起来像这样,应该会停止错误:
require './lib/app'
run SinatraApp
发生的事情是,当您启动 rackup
时,它将解析您的 config.ru
以将应用配置为 运行。在此期间,由于该文件是纯文件 Ruby,您将启动内置的 Sinatra 服务器。这会阻止 rackup 完成,并留下内置服务器 运行ning。
当您稍后停止服务器时,您只是停止了这个内置服务器。 Rack 将继续读取 config.ru
,期望找到 运行 的应用程序,以便它也可以启动服务器。当它在中找不到任何内容时会引发错误。
在你的情况下,我认为发生的是当你部署新版本以前的运行ning服务器时出现的错误
我注意到在我部署我的 sinatra 应用程序时,heroku 产生了一个神秘的错误。它在本地运行良好,事实上,它在 heroku 上也运行良好——但每次部署时(并且仅在部署时),heroku 日志中都会出现此错误:
2017-04-26T08:52:25.579045+00:00 app[web.1]: bundler: failed to load command: rackup (/app/vendor/bundle/ruby/2.3.0/bin/rackup)
2017-04-26T08:52:25.579176+00:00 app[web.1]: RuntimeError: missing run or map statement
2017-04-26T08:52:25.579178+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/builder.rb:146:in `to_app'
2017-04-26T08:52:25.579179+00:00 app[web.1]: /app/config.ru:5:in `<main>'
2017-04-26T08:52:25.579180+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/builder.rb:49:in `eval'
2017-04-26T08:52:25.579180+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/builder.rb:49:in `new_from_string'
2017-04-26T08:52:25.579181+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/builder.rb:40:in `parse_file'
2017-04-26T08:52:25.579182+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/server.rb:299:in `build_app_and_options_from_config'
2017-04-26T08:52:25.579183+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/server.rb:208:in `app'
2017-04-26T08:52:25.579184+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/server.rb:336:in `wrapped_app'
2017-04-26T08:52:25.579184+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/server.rb:272:in `start'
2017-04-26T08:52:25.579185+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/server.rb:147:in `start'
2017-04-26T08:52:25.579186+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/bin/rackup:4:in `<top (required)>'
2017-04-26T08:52:25.579187+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/bin/rackup:23:in `load'
2017-04-26T08:52:25.579215+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/bin/rackup:23:in `<top (required)>'
2017-04-26T08:52:25.724981+00:00 heroku[web.1]: Process exited with status 1
2017-04-26T08:52:26.928566+00:00 heroku[web.1]: Starting process with command `bundle exec rackup config.ru -p 56963`
2017-04-26T08:52:29.278571+00:00 app[web.1]: [2017-04-26 08:52:29] INFO WEBrick 1.3.1
2017-04-26T08:52:29.278590+00:00 app[web.1]: [2017-04-26 08:52:29] INFO ruby 2.3.1 (2016-04-26) [x86_64-linux]
2017-04-26T08:52:29.278909+00:00 app[web.1]: == Sinatra (v1.4.8) has taken the stage on 56963 for production with backup from WEBrick
2017-04-26T08:52:29.279274+00:00 app[web.1]: [2017-04-26 08:52:29] INFO WEBrick::HTTPServer#start: pid=4 port=56963
2017-04-26T08:52:29.825875+00:00 heroku[web.1]: State changed from starting to up
其他帖子表明这可能是由于 config.ru
中的一个错误。我的仅包含:
require './lib/app'
SinatraApp.run!
这是我的 Procfile
:
web: bundle exec rackup config.ru -p $PORT
heroku deploy log is here,以防有帮助。正如我所说,该应用程序似乎运行良好(您可以在上述记录的末尾看到它成功启动),但我不明白是什么导致了每次部署时出现此错误。
谢谢。
你在混淆 Rack’s run
method with Sinatra’s run!
method。
当使用 rackup
时,Rack 期望您的 config.ru
指定您想要 运行 的应用程序。您可以使用 run
(或 map
)方法执行此操作。你的 config.ru
没有这些,所以当 rackup
运行 时它报告你看到的错误:missing run or map statement
.
Sinatra 有自己的 run!
方法。当您调用此方法时,Sinatra 将启动网络服务器并为您的应用程序提供服务。该服务器将遵守各种 Sinatra 设置(例如 set :server, 'puma'
等)。 rackup
不使用此设置。 (我怀疑你的应用程序中有类似 set :port, ENV['PORT']
的行)。
您的 config.ru
应该看起来像这样,应该会停止错误:
require './lib/app'
run SinatraApp
发生的事情是,当您启动 rackup
时,它将解析您的 config.ru
以将应用配置为 运行。在此期间,由于该文件是纯文件 Ruby,您将启动内置的 Sinatra 服务器。这会阻止 rackup 完成,并留下内置服务器 运行ning。
当您稍后停止服务器时,您只是停止了这个内置服务器。 Rack 将继续读取 config.ru
,期望找到 运行 的应用程序,以便它也可以启动服务器。当它在中找不到任何内容时会引发错误。
在你的情况下,我认为发生的是当你部署新版本以前的运行ning服务器时出现的错误