如何让Sinatra在每次更改后自动重新载入文件?

123

我正在使用

# my_app.rb
load 'index.rb'

并像这样启动服务器

ruby my_app.rb

但是它从未重新加载我在首页所做的任何更改。
我错过了什么吗?

9个回答

213

查看Sinatra FAQ,

"如何在Sinatra应用程序更改时重新加载?"

首先,在Ruby中进行进程内代码重新加载很困难,并且对于每种情况都有一个适用的解决方案在技术上是不可能的。

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

首先,如果您尚未安装rerun,则需要安装:

 $ gem install rerun

现在,如果您以以下方式启动Sinatra应用程序:

$ ruby app.rb

重新加载的全部操作只需要这样做:

$ rerun 'ruby app.rb'

如果您例如使用rackup,请改用以下方法:

$ rerun 'rackup'

你懂的。

如果您仍然希望进行进程内重载,请查看Sinatra::Reloader


shotgun需要一个最小的config.ru文件。如果你还没有这个文件,创建一个并在其中放置“require './my_app'”(其中my_app.rb是你的Ruby应用程序),然后你就可以开始了。 - Jeffrey Martinez
对于rerun命令的小补充。你不必局限于默认选项,例如rerun 'rackup'。你可以在任何端口上运行任何服务器。以下是一个示例,演示如何在5678端口上运行Puma — rerun 'rackup -s puma -p 5678 app/sinatra/config.ru' - sashaegorov

45

使用gem安装sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

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

9年后的更新:看起来现在可以使用also_reloaddont_reloadafter_reload重新加载其他文件-- https://github.com/sinatra/sinatra/pull/1150


嘿@Nakilon,我该如何手动重新加载这些文件?我尝试了require "./my-file"但没有成功。 - kristianlm
@kristianlm,require 不会重新加载已经被引用的文件。你需要使用 load 来实现。 - Nakilon
你是对的。我必须重新保存我的 server.rb 文件,才能重新加载我的外部文件。它不会单独检查我的外部文件,所以每次我对外部文件进行更改时,都必须重新保存我的 server.rb 文件。shotgun 在这方面似乎工作得更好,但它似乎也重新加载数据库会话。 - kristianlm
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

14

你可以使用 rerun gem。

gem install rerun
rerun 'ruby app.rb' 

或者如果你正在使用rackup

rerun 'rackup'

11

安装sinatra-reloader gem

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

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

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

你可能希望将环境变量设置为开发环境,并有条件地加载宝石库。


6
当您使用Passenger Standalone运行应用程序时,只需创建一个tmp/always_restart文件即可:
$ touch tmp/always_restart.txt

查看乘客文档以获取更多信息。


5

我喜欢Shotgun宝石。如果你正在使用模块化的Sinatra应用程序并且有一个config.ru文件,那么很容易运行。

shotgun config.ru

请点击这里查看这个宝石。它非常简单,无需配置。


散弹枪很好,但不兼容 Ruby 3+。 - Edward Anderson

4
在Windows系统中,我使用我的restart gem来实现这个功能:
restart ruby my_app.rb

或者,使用rackup:

restart rackup

更多信息请参见此处,希望您会觉得有用。


文档说明它不能在Windows上工作,我已经尝试过了,它可以加载Sinatra但无法在更改时重新加载。 - peter

1
你可以使用guard-rack。从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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接