当我部署sinatra应用程序时,我注意到heroku正在产生一个神秘的错误。它在本地工作正常,事实上,它在heroku上运行良好 - 但是每次部署时都会在heroku日志中出现此错误(并且仅在部署时):
config.ru
其他帖子表明这可能是由于require './lib/app'
SinatraApp.run!
中的错误造成的。我只是包含:
Procfile
这是我的web: bundle exec rackup config.ru -p $PORT
:
var raven = document.getElementById("js-raven"),
width = $(window).width() + 200,
tl = new TimelineLite({
delay: 2,
onComplete: function() {
this.restart();
}
});
tl
.from(raven, 0, {x: -200})
.to(raven, 20, { x: width })
.to(raven, 0, { x: width, rotationY: 180, delay: 5 })
.to(raven, 40, { x: -width });
this issue,以防它有用。正如我所说,该应用似乎工作正常(您可以看到它在上述脚本的末尾成功启动),但我无法理解在每次部署时导致此错误的原因。
感谢。
答案 0 :(得分:1)
您将Rack’s run
method与Sinatra’s run!
method混淆。
使用rackup
时,Rack希望您的config.ru
指定您要运行的应用。您可以使用run
(或map
)方法执行此操作。您的config.ru
没有其中任何一个,因此当rackup
运行时,它会报告您看到的错误:missing run or map statement
。
Sinatra有自己的run!
方法。当您致电时,Sinatra将启动一个Web服务器并为您的应用程序提供服务。此服务器将遵循各种Sinatra设置(例如set :server, 'puma'
等)。 rackup
不使用此设置。 (我怀疑你的应用程序中有一行set :port, ENV['PORT']
。)
您的config.ru
应该看起来像这样,应该可以阻止错误:
require './lib/app'
run SinatraApp
当您启动rackup
时,它将解析您的config.ru
以配置要运行的应用。在此期间,由于此文件是纯Ruby,因此启动内置的Sinatra服务器。这样可以阻止机架完成,并使内置服务器运行。
当您稍后停止服务器时,您只是停止此内置服务器。 Rack将继续阅读config.ru
,希望找到一个可以运行的应用程序,以便它也可以启动服务器。当它没有找到任何引起错误时。
在您的情况下,我认为发生的是在部署新版本时从上一个运行的服务器引发的错误