如何在 rails 应用程序中包含 plugin/engine?

How to include a plugin/engine in a rails application?

这是我第一次与 rails 插件互动,我无法理解它是如何工作的。我要做一个railsplugin/engine。我想在我的 rails 应用程序(一个不同的项目)中包含这个插件,我该怎么做?我发现 this 这表明

At the root of this brand new engine's directory lives a plugin_name.gemspec file. When you include the engine into an application later on, you will do so with this line in the Rails application's Gemfile:

gem 'plugin_name', path: 'engines/plugin_name'

我的问题是我该怎么做?我的意思是当我创建一个 rails 应用程序时,我在文件夹结构中找不到任何 engines 目录。还有我必须将插件项目中的哪些目录放在 engines/ 目录中?
我通过

创建了一个插件
rails plugin new plugin_name --mountable

它生成以下 files/directories:

|-app/
|-bin/                
|-config/
|-demo_project.gemspec
|-Gemfile
|-Gemfile.lock
|-lib/
|-MIT-LICENSE
|-Rakefile
|-README.md
|-test
  |-dummy
    |-(contains a rails application)

现在我用完这个插件后,如何将它包含在另一个 rails 应用程序中? engines/ 除了在 gemfile 中包含插件外,我还需要在什么目录中放置?

除此之外,我还想要一些有关以下内容的信息

Additionally, the --mountable option tells the generator to mount the engine inside the dummy testing application located at test/dummy by adding the following to the dummy application's routes file at test/dummy/config/routes.rb:

mount PluginName::Engine => "/plugin_name"

安装点表示什么?一旦插件包含在 rails 应用程序中,它的作用是什么?

Rails 引擎是一个独立的 rails 应用程序,安装在主应用程序内。创建引擎的两个主要原因是应用程序部分的隔离(可能打算将应用程序分成几部分)和代码重用(当您在多个应用程序中使用相同的引擎时)

从技术上讲,它是一个 ruby gem,但引擎通常作为较大应用程序的独立部分启动(和运行),而不是完全提取到自己的存储库中,gem出版等 例如,如果您的应用程序有 admin 部分,您可以将其设为引擎:

# in gemfile:
gem 'admin', path: 'engines/admin'

# routes:
mount Admin::Engine => '/admin'

# engine's routes:
resources :foo # => because of being in an engine this will be /admin/foo

目录结构如下所示:

|-app/
|-bin/
|-...
|-config/
  |-application.rb
  |-routes.rb
|-engines/
  |-admin_engine/
    |-app/
      |-controllers/admin/
          |- foo_controller.rb
    |-config/
      |-routes.rb # <- this is engine's routes
    |-lib/
      |-admin/
        |-engine.rb
    |- admin.gemspec