Ruby on Rails中的Gem包,插件和引擎有什么区别?
我认为我们在Rails3.2之前使用插件,在rails3.2发布之后我们使用gem包作为插件但是如何在ROR中使用引擎?
答案 0 :(得分:16)
你知道来自Rails 2的插件(即vendor/plugins
文件夹下的插件)不适用于Rails 3.2;在Rails 4中完全删除了对它的支持。现在,有一个"gemified plugin"的概念,其中插件基本上构建为gems,并且可以在不同的Rails应用程序之间共享。
但要回答有关宝石与插件的问题,请查看此Stackoverflow answer。简而言之,Rails 2 Universe中的plugins
是rails应用程序的 扩展 ,而gem是打包的ruby应用程序。
对于Rails引擎,我发现这是Rails引擎的a pretty easy and intuitive definition:
Rails Engines基本上是一个完整的Rails应用程序,它位于另一个应用程序的容器中。换句话说,正如文档所指出的那样:应用程序本身基本上只是根级别的引擎。多年来,我们已经将sen引擎视为gems的一部分,例如devise或rails_admin。这些示例通过在应用程序中“安装”大量相对独立的功能来展示引擎的强大功能。
由于两种rails引擎和插件都是ruby应用程序的类型,因此它们在技术上都可以打包并用作gem(通常)。
答案 1 :(得分:10)
引自 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 MIT-LICENSE
11,969 Rakefile
8,001自述文件 lib目录包含所有gem源代码。
我们可以安装,升级和查询gem版本。如果使用像GemInstaller这样的工具,可以使用一个简单的配置文件轻松自动安装和加载RubyGems。
- 安装了Ruby解释器的Gem可以由该解释器在系统范围内使用。
- Gem可能会作为插件发布。
- 也可以在供应商/宝石中出售。
插件
- 插件是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 init.rb
25 install.rb
DIR lib
549 Rakefile
536自述文件 DIR 任务
DIR 测试
lib目录包含所有插件源代码。
Gem vs Plugins
引擎
rails术语中的Engine
实际上是Web应用程序的子应用程序。例如,博客,论坛或简单身份验证:这些不是完整的应用程序,而是可以添加到任何rails应用程序的页面/视图/控制器/模型。
在rails2中,这将使用plugin
完成。现在,由于rails3引擎可以打包在gem
。
所以你什么时候使用其中一个:
答案 2 :(得分:9)
自Rails 4以来,已经没有插件了。Rails 4.0 release notes:
Rails ::插件已经消失了。而不是将插件添加到供应商/插件 使用gems或bundler与path或git依赖。
任何引擎都可以包含在gem中。宝石只是“图书馆”的别名。
了解其差异的最佳方法是生成其中三个并查看其目录结构:
bundle gem a_gem
,用于非特定于轨道的功能。
rails plugin new b_railtie
,用于不需要完全类似应用程序设置的rails扩展程序。但是,由于它仍然是特定于rails的设置(例如,你在/test
得到你的Rails虚拟应用程序),你可能会在其中使用 railtie 。 railtie 是一个继承自Rails::Railtie
的类,它为您提供了将代码连接到Rails的舒适DSL。例如,如果您想要执行某些操作:before
一些Rails应用程序初始化步骤,您可以使用initializer
Railtie class_method。 Paperclip
rails plugin new c_engine --full
,用于将成为完整应用程序的rails扩展程序,安装到您的应用程序中。除了基本的非/app
设置之外,它还会为您提供Engine
目录和--full
子类。
rails plugin new c_engine --mountable
,与--full
相同,但会创建名称空间,随时可以加载到您的应用引擎中。 Spree
这是一个非常好的链接:http://hawkins.io/2012/03/defining_plugins_gems_railties_and_engines。
答案 3 :(得分:0)
引擎与插件非常相关。引擎可以是插件,插件可以是引擎。所有这些都可以使用rails plugin
生成器创建,包含2个不同的选项--full
或--mountable
。
我认为Engines和Gems之间的主要区别在于。
Gems 只是一些代码,为在代码中集成它的任何人提供了一系列功能。
它包含:
可以打包并推送到RubyGems服务器
引擎实际上是宝石。所有引擎都可以是宝石(如果已打包),但并非所有宝石都是引擎。
我们可以用不同的词来说,Engines是一个 Ruby on Rails 功能,它可以包含特定于Rails的实体:模型,控制器,视图,迁移。
它需要集成在 Rails 应用程序中,并且无法自行运行。
非常好,快速阅读Artricle