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

Is it possible to include an unbuilt Rails Engine without using the Gemfile?

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

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

我真正想做的就是为一小部分路由获取一个单独的中间件堆栈!

我发现只需按照 Rails::Engine documentation:

要求即可包含引擎

ensure that this file is loaded at the top of your config/application.rb (or in your Gemfile)

所以我尝试了这个,它奏效了:

application.rb:

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

这就回答了这个问题。从技术上讲,在这种情况下所需的所有内容,而不是整个 gem 结构,是 lib 目录中的一个文件,其中包含一个继承自 Rails::Engine 的 class(它具有位于 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