这是我正在构建的真实应用程序的精简示例。当我执行我的应用程序时,这是我得到的结果。您会注意到它在启动之前表示它正在运行。您还会注意到它在发布开始后从未说过运行。
bundle exec rackup
Using thin;
Sapp::App running.
Starting Sapp::App
== Sinatra (v1.4.7) has taken the stage on 4567 for development with backup from Thin
Thin web server (v1.7.0 codename Dunder Mifflin)
Maximum connections set to 1024
Listening on localhost:4567, CTRL+C to stop
我的config.ru是:
# http://www.rubydoc.info/gems/webmachine/Webmachine/Adapters/Rack
$started = false
require 'thin'
require 'sinatra'
set :server, (ENV['RACK_ENV'] == 'production' || ENV['RACK_ENV'] == 'staging' ? 'rack' : 'thin')
puts "Using #{settings.server};"
load 'webmachine/adapters/rack.rb'
load File.join(File.dirname(__FILE__), 'sapp.rb')
$started = true
puts 'Starting Sapp::App'
#Sapp::App.run!
Sinatra::Application.run!
我设置$ start只是为了尝试解决这个问题,但它没有帮助。我的应用程序在设置之前执行。我可以控制但是,这就是问题,在发布运行后它不会执行。
sapp.rb是:
ENV['RACK_ENV'] ||= 'development'
Bundler.setup
$: << File.expand_path('../', __FILE__)
$: << File.expand_path('../lib', __FILE__)
require 'dotenv'
Dotenv.load(
File.expand_path("../.env.#{ENV['RACK_ENV']}", __FILE__),
File.expand_path("../.env", __FILE__))
module Sapp
class App < Sinatra::Application
puts 'Sapp::App has been started.' if $started
puts 'Sapp::App running.'
end
end
最后,如果没有别的,一旦它说&#34;启动Sapp :: App&#34;,它也应该说&#34; Sapp :: App已经启动。&#34;和#34; Sapp :: App正在运行。&#34;
对于记录,这两个选项都做同样的事情:
Sapp::App.run!
Sinatra::Application.run!
答案 0 :(得分:1)
好的,我明白了。我把代码放在一个类中,但不是一个方法。加载或要求两者都运行这样的开放代码。我需要将它包装在方法中,并执行方法,以执行我想要做的事情。
我遵循的Sinatra示例并未明确说明这一主题。许多都是如此简单,它没有什么区别,有些只是在config.ru中编码。我来自Rails,虽然我从Rails知道这一点,但由于绝大多数代码已经存在于方法中,因此它并没有太大的区别。