【问题标题】:Automatic Reloading of Sinatra App mounted inside Rails App自动重新加载安装在 Rails 应用程序中的 Sinatra 应用程序
【发布时间】:2018-02-28 14:34:56
【问题描述】:

在将 Sinatra 应用程序添加到现有 Rails 应用程序时,我遇到了一个我希望比我更有经验的人可以轻松解决的问题。

我目前有一个大型 Rails 单体,我计划将其拆分为一个由 JSON API 支持的 SPA。由于在 API 完成之前我仍然需要支持单体应用程序,因此我想在现有的 Rails 应用程序中安装 API(用 Sinatra 编写),因为我将功能移植过来,目标是在几个月内删除 Rails 应用程序本身。我在 Rails 中安装 Sinatra 应用程序而不是将其设置为单独服务的原因是,我希望在两者之间轻松共享代码,因为我打算在迁移完成后继续使用 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 应用程序的入口点也相当简单,只需加载几个控制器来分割路由:

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 的预期,但我无法充分利用我的 google-fu 来找到解决方案。 Rails 会按预期自动重新加载每个更改/请求的代码,但 Sinatra 不会。每次我更改 Sinatra API 中的控制器代码时,我都需要重新启动整个 Rails 服务器以提供新内容。由于我的开发环境在 docker 容器中运行,因此每次启动可能需要一段时间并且变得很麻烦。

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

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

【问题讨论】:

    标签: ruby-on-rails ruby sinatra


    【解决方案1】:

    就像单独使用 Sinatra 应用程序一样,安装在 o rails 内的 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。他的方法更彻底,但也更复杂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多