【问题标题】:Gem Vs Plugin Vs Engine in Ruby on RailsRuby on Rails 中的 Gem Vs Plugin Vs Engine
【发布时间】:2014-04-16 19:28:53
【问题描述】:

Ruby on Rails 中的 Gem 包、插件和引擎有什么区别?

我认为我们在 Rails3.2 之前使用插件,在 Rails3.2 发布之后我们使用 gem 包作为插件,但是我们如何在 ROR 中使用引擎?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2


    【解决方案1】:

    Rails 2 中的插件(即vendor/plugins 文件夹下的插件)在 Rails 3.2 中已弃用;在 Rails 4 中完全删除了对它的支持。现在,有一个 "gemified plugin" 的概念,其中插件本质上是作为 gem 构建的,并且可以在不同的 Rails 应用程序之间共享。

    但要回答您关于 gem 与插件的问题,请查看Stackoverflow answer。长话短说,来自 Rails 2 世界的plugins 是 rails 应用程序的扩展,而 gem 是打包的 ruby​​ 应用程序。

    至于 Rails 引擎,我发现这是 Rails 引擎的 a pretty easy and intuitive definition

    Rails Engines 基本上是一个完整的 Rails 应用程序,它存在于另一个应用程序的容器中。换句话说,正如文档所指出的:应用程序本身基本上只是根级别的引擎。多年来,我们将 sen 引擎视为 gem 的一部分,例如 devise 或 rails_admin。这些示例通过提供大量“安装”到应用程序中的相对独立的功能来展示引擎的强大功能。

    而且由于 rails 引擎和插件都是 ruby​​ 应用程序的类型,它们在技术上都可以被打包并用作 gem(通常)。

    【讨论】:

      【解决方案2】:

      自 Rails 4 以来没有更多的插件Rails 4.0 release notes:

      Rails::Plugin 已消失。而不是将插件添加到供应商/插件 使用带有路径或 git 依赖项的 gems 或 bundler。

      任何引擎都可以包含在 gem 中。 Gem 只是“库”的别名。


      查看它们的区别的最佳方法是生成其中三个并查看它们的目录结构

      bundle gem a_gem,用于非特定于 Rails 的功能。

      rails plugin new b_railtie,用于不需要完整的类似应用程序设置的 Rails 扩展。但是,由于它仍然是特定于 Rails 的设置(例如,您在 /test 中获得了您的 Rails 虚拟应用程序),您可能会在其中使用 railtierailtie 是一个继承自 Rails::Railtie 的类,它为您提供了舒适的 DSL 以将您的代码连接到 Rails。例如,如果你想在:before一些Rails应用程序初始化步骤中执行一些操作,你可以使用initializerRailtie class_method。 Paperclip

      rails plugin new c_engine --full,用于 Rails 扩展,这些扩展本身将是成熟的应用程序,安装到您的应用程序中。除了基本的非--full 设置之外,还会为您提供/app dir 和Engine 子类。

      rails plugin new c_engine --mountable,与--full 相同,但会创建命名空间,准备好挂载到您的应用引擎中。 Spree

      这里有一个很好的链接:http://hawkins.io/2012/03/defining_plugins_gems_railties_and_engines

      【讨论】:

        【解决方案3】:

        答案来自Difference between plugins and Ruby gems?

        宝石
        • Gem 是一个打包的 ruby​​ 应用程序,使用 RubyGems 定义的打包系统。
        • Rails 本身就是一颗宝石。

          Rails gem 安装在 jruby-1.0\lib\ruby\gems\1.8\gems\rails-1.2.3 为:

          DIR bin
          DIR 内置
          68,465 CHANGELOG
          DIR 配置
          DIR 调度
          DIR doc
          DIR 环境
          307 fresh_rakefile
          DIR 助手
          DIR html
          DIR lib
          1,072 麻省理工学院执照
          11,969 个 Rakefile
          8,001 自述文件
          lib 目录包含所有 gem 源代码。

        • 我们可以安装、升级和查询gem版本。如果有人使用像我的GemInstaller这样的工具,可以通过一个简单的配置文件轻松地自动安装和加载RubyGems。

        • 为 Ruby 解释器安装的 Gem 可由该解释器在系统范围内使用。
        • Gem 可以作为插件发布。
        • 也可以在 vendor/gems 中出售。

        插件

        • 插件是 Rails 框架的扩展。
        • 无法使用命令升级。要升级一个必须卸载然后安装升级版本。
        • 必须挂接到 Rails 应用程序中。 (必须有 init.rb)
        • 有一个 install.rb 文件。
        • 插件不能作为 Gem 发布。
        • 只能在应用程序范围内使用。

        Goldspike 插件安装在应用程序的 vendor\plugins\rails-integration 目录中:
        7,089 build.xml
        1,141 个 LICENSE.txt
        DIR 插件
        6,675 pom.xml
        1,447 个自述文件
        DIR 示例
        plugins/goldspike 目录由
        24 初始化.rb
        25 install.rb
        DIR lib
        第549话
        536 个自述文件
        DIR 任务
        DIR 测试
        lib目录包含所有插件源代码。

        Gem 与插件

        • Rails 有一种从 vendor/plugins/ 目录加载插件的方法。这很可能会被弃用,因为 Rails 添加了对将 gem 与项目捆绑在一起的支持 在供应商/宝石/目录中。 rspec 的 gem 版本是为日常使用而设计的。除非您支持 1.2.x 系列或更早版本的 Rails 应用程序,否则应该使用这些。
        • 使用 Gems 签入和签出存储库通常会变得更快,因为您没有在实际应用程序中包含库。 使用与分布式团队之间的软件版本不兼容有关的插件问题通常较少。
        • 一般的经验法则是将特定于 Rails 的功能变成插件,同时将更通用的 Ruby 库变成 gem。

        引擎

        Rails 术语中的Engine 实际上是 Web 应用程序的子应用程序。例如,博客、论坛或简单的身份验证:这些不是成熟的应用程序,而是可以添加到任何 Rails 应用程序的页面/视图/控制器/模型。

        在 rails2 中,这将使用 plugin 来完成。现在,由于 rails3 引擎可以封装在 gem 中。

        • gem:是一个通用库,可以轻松安装,有版本管理,有依赖等。
        • 引擎:是 Rails 应用程序的子应用程序,从 Rails 3 开始,这些引擎作为 gem 分发(太棒了!)。

        那么你什么时候会使用其中一个:

        • 如果您想共享 ruby​​ 功能,请创建一个 gem
        • 如果您的 Rails 应用程序的某些部分可以更普遍地使用,请创建一个引擎(并将其打包在一个 gem 中)。

        Here is an archived tutorial for creating an engine..

        【讨论】:

          【解决方案4】:

          引擎与插件非常相关。引擎可以是插件,插件可以是引擎。所有这些都可以使用 rails plugin 生成器创建,具有 2 个不同的选项 --full--mountable

          我认为引擎和宝石之间的主要区别。

          Gems 只是一小段代码,可为任何将其集成到其代码中的人提供一组功能。

          它包含:

          • 宝石规格
          • Lib 文件夹

          可以打包推送到RubyGems服务器

          引擎实际上是宝石。所有引擎都可以是 gem(如果已打包),但并非所有 gem 都是引擎。

          我们可以换个说法,引擎是 Ruby on Rails 功能,它可以包含特定于 Rails 的实体:模型、控制器、视图、迁移。

          它需要集成在 Rails 应用程序中,不能单独运行。

          非常好,快速阅读Artricle

          【讨论】:

            猜你喜欢
            • 2012-02-01
            • 2018-02-11
            • 1970-01-01
            • 1970-01-01
            • 2021-08-16
            • 2014-01-08
            • 2012-01-16
            • 1970-01-01
            • 2015-02-04
            相关资源
            最近更新 更多