Answers:
请参阅Sinatra常见问题解答,
首先,在Ruby中重载进程内代码非常困难,从技术上讲,不可能有一种适用于每种情况的解决方案。
这就是为什么我们建议您进行进程外重新加载的原因。
首先,您还需要安装rerun:
$ gem install rerun
现在,如果您像这样启动Sinatra应用程序:
$ ruby app.rb
您要做的只是重新加载:
$ rerun 'ruby app.rb'
例如,如果您使用机架,则请执行以下操作:
$重新运行“机架”
你明白了。
如果您仍要进行进程内重新加载,请签出
Sinatra::Reloader
。
rerun
。您不受默认选项的限制,例如rerun 'rackup'
。可以在任何端口上运行任何服务器。这是示例如何在端口号5678上运行Puma —rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
gem install sinatra-reloader
require 'sinatra'
require 'sinatra/reloader'
注意:它将仅重载sinatra处理程序(以及某些sinatra服务器配置命令),而不重载必须手动重载的自定义文件。
经过9年的UPD:好像它已经可以使用重新加载其他文件also_reload
,dont_reload
以及after_reload
- https://github.com/sinatra/sinatra/pull/1150
require "./my-file"
没有成功
require
如果已经需要,则不会重新加载文件。你load
代替。
server.rb
不过,我必须重新保存我的文件才能重新加载外部文件。它不会单独检查我的外部文件,因此sever.rb
每次对外部文件进行更改时,我都必须重新保存。gun弹枪在这方面似乎更好地工作,但它似乎也可以重新加载数据库会话。
configure :development do |c| require 'sinatra/reloader' c.also_reload "./lib/*.rb" c.also_reload "./controllers/*.rb" c.also_reload "./init/*.rb" end
在使用Passenger Standalone运行应用程序时,只需创建一个tmp/always_restart
文件:
$ touch tmp/always_restart.txt
有关更多信息,请参见乘客文档。
您可以使用防护架。摘自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
每次都会重新加载。