【发布时间】:2010-11-17 20:12:25
【问题描述】:
我正在使用
# my_app.rb
load 'index.rb'
然后像这样启动服务器
ruby my_app.rb
但它永远不会重新加载我在索引页面中所做的任何更改。
我错过了什么吗?
【问题讨论】:
我正在使用
# my_app.rb
load 'index.rb'
然后像这样启动服务器
ruby my_app.rb
但它永远不会重新加载我在索引页面中所做的任何更改。
我错过了什么吗?
【问题讨论】:
"How do I make my Sinatra app reload on changes?"
首先,在 Ruby 中重新加载进程内代码很困难,而且 适用于所有场景的解决方案在技术上是不可能的。
这就是我们建议您进行进程外重新加载的原因。
如果您还没有安装rerun,首先需要安装:
$ gem install rerun现在,如果您像这样启动您的 Sinatra 应用程序:
$ ruby app.rb您只需执行以下操作即可重新加载:
$ rerun 'ruby app.rb'例如,如果您正在使用 rackup,请改为 以下:
$ rerun 'rackup'
你明白了。
如果您仍想进行进程内重新加载,请查看
Sinatra::Reloader。
【讨论】:
rerun 的小补充。您不受默认选项的限制,即rerun 'rackup'。可以在任何端口上运行任何服务器。下面是如何在端口号 5678 上运行 Puma 的示例 — rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
gem 安装 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。 shotgun 在这方面似乎工作得更好,但它似乎也重新加载了数据库会话。
configure :development do |c| require 'sinatra/reloader' c.also_reload "./lib/*.rb" c.also_reload "./controllers/*.rb" c.also_reload "./init/*.rb" end
您可以使用rerun gem。
gem install rerun
rerun 'ruby app.rb'
或者如果您使用的是机架
rerun 'rackup'
【讨论】:
gem install sinatra-reloader
require 'sinatra/base'
require "sinatra/reloader"
class MyApp < Sinatra::Base
register Sinatra::Reloader
get '/' do
"Hello Testing1!"
end
end
您可能希望将环境变量设置为开发并有条件地加载 gem。
【讨论】:
当您使用Passenger Standalone 运行应用程序时,只需创建一个tmp/always_restart 文件:
$ touch tmp/always_restart.txt
更多信息请联系乘客documentation。
【讨论】:
我喜欢 Shotgun 宝石。如果您使用的是模块化 Sinatra 应用程序并且有一个 config.ru 文件,那么它很容易运行。
shotgun config.ru
查看宝石here。它相当简单,无需配置。
【讨论】:
【讨论】:
你可以使用护栏。摘自article at 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 每次都会重新加载。
【讨论】:
如果您只更改模板,如果您将环境设置为开发,sinatra 将始终重新呈现它们:
ruby app.rb -e development
【讨论】: