将sinatra app部署到heroku的神秘错误:bundler:无法加载命令:rackup

时间:2017-04-26 09:03:57

标签: ruby heroku sinatra rack

当我部署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,以防它有用。正如我所说,该应用似乎工作正常(您可以看到它在上述脚本的末尾成功启动),但我无法理解在每次部署时导致此错误的原因。

感谢。

1 个答案:

答案 0 :(得分:1)

您将Rack’s run methodSinatra’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,希望找到一个可以运行的应用程序,以便它也可以启动服务器。当它没有找到任何引起错误时。

在您的情况下,我认为发生的是在部署新版本时从上一个运行的服务器引发的错误