是否可以在不使用Gemfile的情况下包含未构建的Rails引擎?

时间:2017-01-06 19:54:09

标签: ruby-on-rails rails-engines rack-middleware

这可能是一个人为的问题,但我正在研究Rails API,并希望保持API中间件堆栈最小化,同时提供需要一些更复杂的中间件的OAuth端点。我的想法是把它变成一个引擎,并在应用程序中包含该引擎。

但是,我认为创建一个Rails引擎比创建一个新的引擎gem并在我的Gemfile中包含gem更容易。有没有办法从kmeans或其他东西中...... require 'lib/engines/my_engine'?我不需要gemspec只包含一个未构建的引擎 - 我可以将所有依赖项放在主应用程序的Gemfile中。

我真正想做的就是为一小组路线获得一个单独的中间件堆栈!

1 个答案:

答案 0 :(得分:2)

我发现根据Rails::Engine documentation要求可以包含引擎:

  

确保此文件已加载到您的文件顶部   config / application.rb(或在你的Gemfile中)

所以我尝试了这个,它起作用了:

<强> application.rb中:

# after Bundler.require(...)
require_relative '../lib/engines/oauth_server/lib/oauth_server'

所以这回答了这个问题。从技术上讲,在这种情况下所需的全部内容,而不是整个gem结构,是lib目录中的一个文件,其中包含一个继承自Rails :: Engine的类(它必须在lib中确保如果存在,将自动包含相邻的app, config, vendor etc. directories。当然,如果您打算将此引擎用于任何事情,那么config/routes.rb文件;)

例如,我的引擎(上面要求)看起来像这样:

module OauthServer
  class Engine < ::Rails::Engine
    middleware.use ActionDispatch::Cookies
    middleware.use ActionDispatch::Session::CookieStore
    middleware.use ActionDispatch::Flash
  end
end

但是,我还发现Rails引擎似乎从它所包含的应用程序中继承了中间件,所以我回到原来的问题,有人之前已经问过这个问题:Build 2 middleware stacks in Rails app < / p>