【发布时间】: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
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
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(通常)。
【讨论】:
自 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 虚拟应用程序),您可能会在其中使用 railtie。 railtie 是一个继承自 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。
【讨论】:
答案来自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 术语中的Engine 实际上是 Web 应用程序的子应用程序。例如,博客、论坛或简单的身份验证:这些不是成熟的应用程序,而是可以添加到任何 Rails 应用程序的页面/视图/控制器/模型。
在 rails2 中,这将使用 plugin 来完成。现在,由于 rails3 引擎可以封装在 gem 中。
那么你什么时候会使用其中一个:
【讨论】:
引擎与插件非常相关。引擎可以是插件,插件可以是引擎。所有这些都可以使用 rails plugin 生成器创建,具有 2 个不同的选项 --full 或 --mountable。
我认为引擎和宝石之间的主要区别。
Gems 只是一小段代码,可为任何将其集成到其代码中的人提供一组功能。
它包含:
可以打包推送到RubyGems服务器
引擎实际上是宝石。所有引擎都可以是 gem(如果已打包),但并非所有 gem 都是引擎。
我们可以换个说法,引擎是 Ruby on Rails 功能,它可以包含特定于 Rails 的实体:模型、控制器、视图、迁移。
它需要集成在 Rails 应用程序中,不能单独运行。
非常好,快速阅读Artricle
【讨论】: