Выполнить код после запуска сервера Sinatra - PullRequest
6 голосов
/ 07 апреля 2010

У меня есть приложение Sinatra, заключенное в Sinatra::Base, и я хотел бы запустить некоторый код после запуска сервера, как мне это сделать?

Вот пример:

require 'sinatra'
require 'launchy'

class MyServer < Sinatra::Base
  get '/' do
    "My server"
  end

  # This is the bit I'm not sure how to do
  after_server_running do
    # Launches a browser with this webapp in it upon server start
    Launchy.open("http://#{settings.host}:#{settings.port}/")
  end
end

Есть идеи?

Ответы [ 4 ]

4 голосов
/ 17 сентября 2013

Использование блока конфигурации не является правильным способом сделать это. Всякий раз, когда вы загружаете файл, команды будут выполняться.

Попробуйте расширить run!

require 'sinatra'
require 'launchy'

class MyServer < Sinatra::Base

  def self.run!
    Launchy.open("http://#{settings.host}:#{settings.port}/")
    super
  end

  get '/' do
    "My server"
  end
end
2 голосов
/ 09 августа 2016

Если вы используете Rack (которым вы, вероятно,), я только что обнаружил, что есть функция, которую вы можете вызвать в config.ru (технически это метод экземпляра Rack::Builder), который позволяет вам запускать блок кода после сервер был запущен. Он называется warmup, и вот документированный пример использования:

warmup do |app|
  client = Rack::MockRequest.new(app)
  client.get('/')
end

use SomeMiddleware
run MyApp
2 голосов
/ 30 сентября 2015

Вот как я это делаю; в основном выполняется либо sinatra, либо другой код в отдельном потоке:

require 'sinatra/base'

Thread.new { 
  sleep(1) until MyApp.settings.running?
  p "this code executes after Sinatra server is started"
}
class MyApp < Sinatra::Application
  # ... app code here ...

  # start the server if ruby file executed directly
  run! if app_file == $0
end
0 голосов
/ 13 мая 2016

Единственный действительный ответ в stackoverflow на этот вопрос (который задается 3-4 раза) дается levinalex на Запустить и вызвать сервер Ruby HTTP в том же сценарии Я цитирую:

run! в текущих версиях Sinatra принимает блок, который вызывается при запуске приложения.

Используя этот обратный вызов, вы можете сделать это:

require 'thread'

def sinatra_run_wait(app, opts)
  queue = Queue.new
  thread = Thread.new do
    Thread.abort_on_exception = true
    app.run!(opts) do |server|
      queue.push("started")
    end
  end
  queue.pop # blocks until the run! callback runs
end

sinatra_run_wait(TestApp, :port => 3000, :server => 'webrick')

Это кажется надежным для WEBrick, но при использовании Thin обратный вызов все равно иногда вызывается немного раньше, чем сервер принимает подключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...