Como fazer o Sinatra recarregar automaticamente o arquivo após cada alteração?


118

estou usando

# my_app.rb
load 'index.rb'

e inicie o corte assim

ruby my_app.rb

mas nunca recarrega as alterações feitas na página de índice.
Eu perdi alguma coisa aqui?

Respostas:


203

Veja o Sinatra FAQ ,

"Como faço para recarregar meu aplicativo Sinatra com as alterações?"

Em primeiro lugar, recarregar o código em processo em Ruby é difícil e ter uma solução que funcione para todos os cenários é tecnicamente impossível.

É por isso que recomendamos que você faça o recarregamento fora do processo.

Primeiro você precisa instalar a nova execução, caso ainda não tenha:

 $ gem install rerun

Agora, se você iniciar seu aplicativo Sinatra assim:

$ ruby app.rb

Tudo que você precisa fazer para recarregar é, em vez disso:

$ rerun 'ruby app.rb'

Se você estiver, por exemplo, usando rackup, faça o seguinte:

$ rerun 'rackup'

Você entendeu a ideia.

Se você ainda deseja recarregar durante o processo, verifique Sinatra::Reloader.


shotgun requer um config.ru mínimo. Se você ainda não tiver um, crie-o e coloque "require './my_app'" (onde my_app.rb é o seu aplicativo ruby) nele e você estará pronto.
Jeffrey Martinez

Pequena adição para rerun. Você não está limitado às opções padrão, ou seja rerun 'rackup'. É possível executar qualquer servidor em qualquer porta. Aqui está um exemplo de como executar o Puma na porta número 5678 -rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
sashaegorov

43

gem install sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

Nota : ele irá recarregar apenas os manipuladores do sinatra (e, talvez alguns comandos de configuração do servidor do sinatra), mas não os arquivos personalizados, que você tem que recarregar manualmente.

UPD após 9 anos: parece que já é possível recarregar outros arquivos usando also_reload, dont_reloade after_reload- https://github.com/sinatra/sinatra/pull/1150


Ei @Nakilon, como faria para recarregar esses arquivos manualmente? Estou indo require "./my-file"sem sucesso
kristianlm

@kristianlm, requirenão recarrega o arquivo, se já foi necessário. Em loadvez disso.
Nakilon,

você está certo. Eu tenho que salvar meu novamente server.rb, no entanto, para que ele recarregue meu arquivo externo. Ele não verifica meu arquivo externo sozinho, então tenho que salvá-lo novamente sever.rbtoda vez que faço uma alteração em meu arquivo externo. O shotgun parece funcionar melhor nesse aspecto, mas também parece recarregar as sessões do banco de dados.
kristianlm

9
Use o método also_reload para especificar quais arquivos recarregar:configure :development do |c| require 'sinatra/reloader' c.also_reload "./lib/*.rb" c.also_reload "./controllers/*.rb" c.also_reload "./init/*.rb" end
Opptatt Jobber

12

Você pode usar a rerungema.

gem install rerun
rerun 'ruby app.rb' 

OU se você estiver usando rackup

rerun 'rackup'

8

gem install sinatra-reloader

require 'sinatra/base'
require "sinatra/reloader"

class MyApp < Sinatra::Base
  register Sinatra::Reloader

  get '/' do
    "Hello Testing1!"
  end
end

Você pode querer definir a variável de ambiente para desenvolvimento e carregar condicionalmente a gema.



5

Eu gosto da gema Shotgun. Se você estiver usando um aplicativo Sinatra modular e tiver um arquivo config.ru, é fácil de executar.

shotgun config.ru

Verifique a joia aqui . É bastante simples e nenhuma configuração necessária.


4

No Windows, estou usando minha gem de reinicialização para isso:

restart ruby my_app.rb

ou, com rackup:

restart rackup

Veja aqui para mais informações, espero que seja útil.


a documentação afirma que não funciona no windows, tentei e carrega o sinatra, mas não recarrega no chenges
peter

1

Você pode usar guarda-rack. Retirado de um artigo em dblock.org :

Adicione isso ao seu Gemfile:

group :development do
  gem "guard"
  gem "guard-bundler"
  gem "guard-rack"
end

Em seguida, crie um Guardfilena raiz do seu projeto com este conteúdo:

guard 'bundler' do
  watch('Gemfile')
end

guard 'rack' do
  watch('Gemfile.lock')
  watch(%r{^(config|app|api)/.*})
end

Por último, execute o Guard, assim :, bundle exec guarde rackuprecarregará todas as vezes.


0

Se você apenas alterar seus modelos, o sinatra sempre os renderá novamente se você definir seu ambiente para desenvolvimento:

ruby app.rb -e development
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.