每次更改后,如何使Sinatra自动重新加载文件?


118

我在用

# my_app.rb
load 'index.rb'

然后像这样启动服务器

ruby my_app.rb

但它永远不会重新加载我在索引页中所做的任何更改。
我在这里想念什么吗?

Answers:


203

请参阅Sinatra常见问题解答

“如何使我的Sinatra应用重新加载更改?”

首先,在Ruby中重载进程内代码非常困难,从技术上讲,不可能有一种适用于每种情况的解决方案。

这就是为什么我们建议您进行进程外重新加载的原因。

首先,您还需要安装rerun

 $ gem install rerun

现在,如果您像这样启动Sinatra应用程序:

$ ruby app.rb

您要做的只是重新加载:

$ rerun 'ruby app.rb'

例如,如果您使用机架,则请执行以下操作:

$重新运行“机架”

你明白了。

如果您仍要进行进程内重新加载,请签出Sinatra::Reloader


gun弹枪需要最少的config.ru。如果您还没有,请创建它,然后在其中放置“ require'./my_app'”(其中my_app.rb是您的ruby应用程序),然后进行设置。
杰弗里·马丁内斯

小加为rerun。您不受默认选项的限制,例如rerun 'rackup'。可以在任何端口上运行任何服务器。这是示例如何在端口号5678上运行Puma —rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
sashaegorov

43

gem install sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

注意:它将仅重载sinatra处理程序(以及某些sinatra服务器配置命令),而不重载必须手动重载的自定义文件。

经过9年的UPD:好像它已经可以使用重新加载其他文件also_reloaddont_reload以及after_reload- https://github.com/sinatra/sinatra/pull/1150


嘿@Nakilon,我将如何手动重新加载此类文件?我做的require "./my-file"没有成功
kristianlm 2011年

@kristianlm,require如果已经需要,则不会重新加载文件。你load代替。
Nakilon 2011年

你是对的。server.rb不过,我必须重新保存我的文件才能重新加载外部文件。它不会单独检查我的外部文件,因此sever.rb每次对外部文件进行更改时,我都必须重新保存。gun弹枪在这方面似乎更好地工作,但它似乎也可以重新加载数据库会话。
kristianlm 2011年

9
使用Also_reload方法指定要重新加载的文件: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 2013年

12

您可以使用rerun宝石。

gem install rerun
rerun 'ruby app.rb' 

或者,如果您使用机架

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

您可能需要设置环境变量以进行开发并有条件地加载gem。



5

我喜欢the弹枪的宝石。如果您使用的是模块化Sinatra应用程序,并且具有config.ru文件,则易于运行。

shotgun config.ru

这里查看宝石。这非常简单,不需要配置。



1

您可以使用防护架。摘自dblock.org上一篇文章

将此添加到您的Gemfile中:

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

然后,Guardfile使用以下内容在您的项目的根目录中创建一个:

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

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

最后,运行Guard,就像这样:bundle exec guard,并且rackup每次都会重新加载。


0

如果仅更改模板,则将环境设置为开发时,sinatra将始终重新渲染它们:

ruby app.rb -e development
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.