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?

ez.
fonte

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.

dbr
fonte
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

Nakilon
fonte
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'
zeronone
fonte
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.

rafidude
fonte
6

Ao executar o aplicativo com o Passenger Standalone , basta criar um tmp/always_restartarquivo:

$ touch tmp/always_restart.txt

Consulte a documentação do passageiro para obter mais informações.

karmi
fonte
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.


fonte
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.

Vais Salikhov
fonte
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.

Jeffbyrnes
fonte
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
três
fonte