安装在Rails应用程序内的Sinatra App的自动重新加载

时间:2017-09-19 17:39:09

标签: ruby-on-rails ruby sinatra

在为现有的Rails应用程序添加Sinatra应用程序时,我遇到了一个简单易懂的解决方法,可以帮助那些比我更有经验的人。

我目前有一个大型的rails monolith,我打算拆分成一个由JSON API支持的SPA。由于我仍然需要支持整体,直到API完成,我想在现有的Rails应用程序中安装API(用Sinatra编写),因为我将端口功能移植到目标,在几个月内删除Rails应用程序本身。我将Sinatra应用程序安装在Rails中而不是将其设置为单独服务的原因是我希望在两者之间轻松共享代码,因为我打算在迁移完成后继续使用ActiveRecord作为我在Sinatra中的ORM。

我已经在Rails应用程序中安装了Sinatra模型而没有任何问题使用Rails routes.rb文件:

Rails.application.routes.draw do
  mount API::Core, at: '/api'
...
end

我没有使用config.ru做任何工作,因为在routes.rb文件中安装API似乎符合我的需要。如果我需要增加一些腿部工作来使这个运行正常,这不是问题。

sinatra app的入口点也相当简单,加载了几个控制器来分割路由:

require 'sinatra/base'
require 'sinatra/json'

require_relative 'controllers/first_controller'
require_relative 'controllers/second_controller'

module API
  class Core < Sinatra::Base
    register Sinatra::FirstControllerApi
    register Sinatra::SecondControllerApi

  end
end

我遇到的问题是我对Sinatra的预期,但是我无法灵活地找到一个解决方案。 Rails会按预期自动重新加载每个更改/请求的代码,但Sinatra不会。每次我在Sinatra API中更改控制器代码时,我都需要重新启动整个Rails服务器来提供新内容。由于我的开发环境在docker容器中运行,因此每次启动都需要一段时间,并且变得很麻烦。

对于自动重新加载安装在Rails应用程序中的Sinatra应用程序的问题,是否存在“规范”解决方案,还是我只是过度复杂化问题?我知道Sinatra有一些适用于这个空间的宝石,但我还没有看到任何有关如何让它们在这个“奇怪”边缘情况下工作的信息。

如果您需要更多信息,请告诉我,希望我已经提供足够的信息来理解我的问题。

1 个答案:

答案 0 :(得分:0)

就像它自带的Sinatra应用程序一样,安装在o轨道内的Sinatra应用程序不会在您进行更改时自动重新加载。通常在Sinatra中,人们会使用外部工具来帮助解决这个问题,因此他们可能会设置类似Shotgun的内容来监视目录并在发生更改时重新启动服务器。

但是,像Rails中的大多数事情一样,有一种方法可以帮助您实现自己的编程优势。

的ActiveSupport :: FileUpdateChecker

Rails有一个方便ActiveSupport::FileUpdateChecker可以查看文件或文件列表。当他们改变时,它将回调一个块。您可以使用它来重新加载Sinatra应用程序 - 或其他任何相关内容。

在您的情况下,您可能希望在应用程序的配置块中将以下内容添加到config/environments/development.rb

Rails.application.configure do
  # ...

  sinatra_reloader = ActiveSupport::FileUpdateChecker.new(Dir["path/to/sinatra/app/**"]) do
    Rails.application.reload_routes!
  end

  config.to_prepare do
    sinatra_reloader.execute_if_updated
  end
end

Robert Mosolgo在他的博客上写了一篇很好的文章:Watching Files During Rails Development。他的方法更彻底,但更复杂。