120

我在用

# my_app.rb
load 'index.rb'

并像这样启动服务器

ruby my_app.rb

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

4

9 回答 9

208

请参阅Sinatra 常见问题解答

“如何让我的 Sinatra 应用程序在更改时重新加载?”

首先,在 Ruby 中重新加载进程内代码很困难,并且拥有适用于所有场景的解决方案在技术上是不可能的。

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

首先,如果您还没有安装rerun :

 $ gem install rerun

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

$ ruby app.rb

重新加载所需要做的就是这样做:

$ rerun 'ruby app.rb'

例如,如果您使用 rackup,请执行以下操作:

$ 重新运行“机架”

你明白了。

如果您仍想进行进程内重新加载,请查看Sinatra::Reloader.

于 2009-08-08T10:31:56.507 回答
45

gem 安装 sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

注意:它只会重新加载 sinatra 处理程序(可能还有一些 sinatra 服务器配置命令),但不会重新加载您必须手动重新加载的自定义文件。

9年后的UPD:似乎已经可以使用重新加载其他文件also_reloaddont_reload并且after_reload-- https://github.com/sinatra/sinatra/pull/1150

于 2010-10-20T16:49:44.193 回答
14

你可以使用rerun宝石。

gem install rerun
rerun 'ruby app.rb' 

或者,如果您使用的是 rackup

rerun 'rackup'
于 2013-01-24T04:52:00.533 回答
10

gem 安装 sinatra-reloader

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

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

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

您可能希望将环境变量设置为开发并有条件地加载 gem。

于 2011-09-09T19:54:48.443 回答
6

当您使用Passenger Standalone运行应用程序时,只需创建一个tmp/always_restart文件:

$ touch tmp/always_restart.txt

有关详细信息,请参阅乘客文件

于 2011-11-18T18:13:18.913 回答
5

我喜欢霰弹枪宝石。如果您使用的是模块化 Sinatra 应用程序并且有一个 config.ru 文件,那么它很容易运行。

shotgun config.ru

在这里查看宝石。这是相当直接的,不需要配置。

于 2014-09-30T22:25:00.843 回答
4

在 Windows 上,我为此使用了我的重启 gem

restart ruby my_app.rb

或者,使用机架:

restart rackup

请参阅此处以获取更多信息,希望您发现它有用。

于 2014-09-23T14:14:23.140 回答
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每次都会重新加载。

于 2014-04-24T17:25:06.177 回答
0

如果您只更改模板,如果您将环境设置为开发,sinatra 将始终重新呈现它们:

ruby app.rb -e development
于 2017-10-14T11:21:00.883 回答