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

Posted

技术标签:

【中文标题】如何让 Sinatra 在每次更改后自动重新加载文件?【英文标题】:How to get Sinatra to auto-reload the file after each change? 【发布时间】:2010-11-17 20:12:25 【问题描述】:

我正在使用

# my_app.rb
load 'index.rb'

然后像这样启动服务器

ruby my_app.rb

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

【问题讨论】:

【参考方案1】:

见Sinatra FAQ,

"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

【讨论】:

shotgun 需要一个最小的 config.ru。如果您还没有,请创建它并将“require './my_app'”(其中 my_app.rb 是您的 ruby​​ 应用程序)放入其中,然后就可以设置了。 rerun 的小补充。您不受默认选项的限制,即rerun 'rackup'。可以在任何端口上运行任何服务器。下面是如何在端口号 5678 上运行 Puma 的示例 — rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'【参考方案2】:

gem 安装 sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

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

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

【讨论】:

嘿@Nakilon,我将如何手动重新加载此类文件?我正在做require "./my-file" 没有成功 @kristianlm, require 不会重新加载文件,如果它已经被需要的话。你 load 代替。 你是对的。不过,我必须重新保存我的server.rb,才能让它重新加载我的外部文件。它不会单独检查我的外部文件,因此每次对外部文件进行更改时,我都必须重新保存我的sever.rb。 shotgun 在这方面似乎工作得更好,但它似乎也重新加载了数据库会话。 使用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【参考方案3】:

您可以使用rerun gem。

gem install rerun
rerun 'ruby app.rb' 

或者如果您使用的是机架

rerun 'rackup'

【讨论】:

【参考方案4】:

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】:

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

$ touch tmp/always_restart.txt

更多信息请联系乘客documentation。

【讨论】:

【参考方案6】:

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

shotgun config.ru

查看宝石here。它相当简单,无需配置。

【讨论】:

【参考方案7】:

在 Windows 上,我正在使用我的 restart gem:

restart ruby my_app.rb

或者,使用机架:

restart rackup

更多信息请查看here,希望对您有用。

【讨论】:

文档指出它在 Windows 上不起作用,我试过了,它加载了 sinatra,但在 chenges 上没有重新加载【参考方案8】:

你可以使用护栏。摘自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 guardrackup 每次都会重新加载。

【讨论】:

【参考方案9】:

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

ruby app.rb -e development

【讨论】:

以上是关于如何让 Sinatra 在每次更改后自动重新加载文件?的主要内容,如果未能解决你的问题,请参考以下文章

启动tomcat后,每次修改java文件都会重新加载整个应用(像重新部署),怎么修改让它不重新加载!

IPython中模块的自动重新加载[重复]

如何自动重新加载我的 gunicorn 服务器?

每次 Gulpfile 更改后如何重新启动 Gulp?

为联合服务 apollo GraphQL 中的架构更改自动重新加载网关

如何让 Firefox 在文件更改时自动刷新?