【问题标题】:How to include a plugin/engine in a rails application?如何在 Rails 应用程序中包含插件/引擎?
【发布时间】:2020-10-27 13:49:47
【问题描述】:

这是我第一次与 Rails 插件交互,我无法理解它是如何工作的。我将制作一个 Rails 插件/引擎。我想在我的 Rails 应用程序(一个不同的项目)中包含这个插件,我该怎么做?我发现this 建议

在这个全新引擎目录的根目录下有一个 plugin_name.gemspec 文件。当您稍后将引擎包含到应用程序中时,您将在 Rails 应用程序的 Gemfile 中使用此行:

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

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

rails plugin new plugin_name --mountable

它生成了以下文件/目录:

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

现在,一旦我完成了这个插件,如何将它包含在另一个 Rails 应用程序中?除了在 gemfile 中包含插件之外,我还需要在 engines/ 中放入哪些目录?

除此之外,我还想了解以下内容的一些信息

此外,--mountable 选项告诉生成器将引擎安装到位于test/dummy 的虚拟测试应用程序中,方法是将以下内容添加到位于test/dummy/config/routes.rb 的虚拟应用程序的路由文件中:

mount PluginName::Engine => "/plugin_name"

当插件被包含在 Rails 应用程序中后,挂载点表示什么以及它的作用是什么?

【问题讨论】:

    标签: ruby-on-rails rubygems ruby-on-rails-5 rails-engines ruby-on-rails-plugins


    【解决方案1】:

    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
    

    【讨论】:

    • 所以引擎在我们的主机 Rails 应用程序中充当独立应用程序?从主机应用程序中的引擎访问模型/类怎么样?例如,如果引擎有一个名为 MyModule 的模块,其中有一个模型 Message。是否可以通过 MyModule::Message 在主机应用程序中访问它,还是需要处理其他并发症?
    • @Prime 因为这两个应用程序都加载到一个 ruby​​ 进程中 - 如果他们知道模型和其他类,它们都可以相互访问它们。这并不总是一件好事,因为在某些情况下会导致凝聚力增加并破坏最初的分离目标。但在其他情况下确实有用。
    • 好吧,有道理。我想知道的另一件事是engine.rb 不是自动生成的,而是在生成插件时lib/plugin_name/ 包含railtie.rb 它们是可互换的还是用于不同的目的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多