Ruby on Rails中的Gem Vs插件与引擎
Ruby on Rails中Gem包,插件和引擎有什么区别?
我认为我们在Rails3.2之前使用插件,在rails3.2发布之后我们使用gem包作为插件但是如何在ROR中使用引擎?
您从Rails 2中知道的插件(即vendor/plugins
文件夹下的vendor/plugins
)已弃用Rails 3.2; 在Rails 4中完全删除了对它的支持。现在,有一个“gemified插件”的概念,其中插件基本上构建为gems,并且可以在不同的Rails应用程序之间共享。
但要回答关于gem与插件的问题,请查看此Stackoverflow答案 。 简而言之,Rails 2 Universe中的插件是rails应用程序的扩展 ,而gem是一个打包的ruby应用程序。
至于Rails引擎,我发现这是一个非常简单直观的Rails引擎定义 :
Rails Engines基本上是一个整个Rails应用程序,它位于另一个容器中。 换句话说,正如文档所说:应用程序本身基本上只是根级别的引擎。 多年来,我们已经将sen引擎视为gems的一部分,例如devise或rails_admin。 这些示例通过提供一组“安装”到应用程序中的相对独立的function来展示引擎的强大function。
由于轨道引擎和插件都是ruby应用程序的类型,它们都可以在技术上被打包并用作gem(通常)。
从插件和Rubygem之间的差异引用的答案?
gem
- Gem是一个使用RubyGems定义的打包系统的打包ruby应用程序。
-
Rails本身就是一个gem。
Rails gem安装在jruby-1.0 \ lib \ ruby \ gems \ 1.8 \ gems \ rails-1.2.3中:
DIR bin
DIR内置
68,465 CHANGELOG
DIR配置
DIR派遣
DIR医生
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可以作为插件发布。
- 也可以在供应商/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目录包含所有插件源代码。
gemvs插件
- Rails有一种从vendor / plugins /目录加载插件的方法。 这很可能会弃用,因为Rails已经添加了对与gem / gems /目录中的项目捆绑gems的支持。 rspec的gem版本是用于日常使用的版本。 除非您在1.2.x系列或更早版本中支持Rails应用程序,否则应该使用它们。
- 使用Gems登记和签出存储库通常会变得更快,因为您没有在实际应用程序中包含库。 使用与分布式团队中软件版本不兼容的插件相关的插件通常较少。
- 一般经验法则是将Rails特定function作为插件,同时将更多通用Ruby库转换为gem。
发动机
rails术语中的Engine
实际上是Web应用程序的子应用程序。 例如,博客,论坛或简单身份validation:这些不是完整的应用程序,而是可以添加到任何rails应用程序的页面/视图/控制器/模型。
在rails2中,这将使用plugin
完成。 现在因为rails3引擎可以包装在gem
。
- gem:是一个通用库,可以轻松安装,由版本管理,具有依赖性等。
- 引擎:是Rails应用程序的子应用程序,并且由于Rails 3,它们作为gem分发(这很棒!)。
所以你什么时候使用其中一个:
- 如果要共享rubyfunction,请创建一个gem
- 如果您的rails应用程序的某些部分可以更普遍地使用,则创建一个引擎(并将其打包在gem中)。
这是一个用于创建引擎的存档教程。
自Rails 4以来没有更多的插件 .Rails 4.0发行说明 :
Rails ::插件已经消失了。 而不是将插件添加到供应商/插件,而是使用带有路径或git依赖关系的gem或bundler。
任何引擎都可以包含在gem中。 gem只是“图书馆”的别名。
了解它们的不同之处的最佳方法是生成其中三个并查看其目录结构 :
bundle gem a_gem
,用于非特定于rails的function。
rails plugin new b_railtie
,用于不需要完全类似应用程序设置的rails扩展。 但是,因为它仍然是特定于轨道的设置(例如你在/test
得到你的Rails虚拟应用程序),你可能会在其中使用railstie 。 railtie是一个inheritance自Rails::Railtie
的类,它为您提供了将代码连接到Rails的舒适DSL。 例如,如果您想要执行某些操作:before
某些Rails应用程序初始化步骤之前,您可以使用initializer
Railtie class_method。 回形针
rails plugin new c_engine --full
,用于rails扩展,将成为完全成熟的应用程序,安装到您的应用程序中。 除了基本的非--full
设置之外,还会给你/app
dir和Engine
子类。
rails plugin new c_engine --mountable
,与rails plugin new c_engine --mountable
相同,但会创建名称空间,随时可以安装到你的app引擎中。 狂欢
这是一个非常好的链接: http : //hawkins.io/2012/03/defining_plugins_gems_railties_and_engines 。
引擎与插件非常相关。 引擎可以是插件,插件可以是引擎。 所有这些都可以使用rails plugin
生成器创建,具有2个不同的选项--full
或--mountable
。
我认为Engines和Gems之间的主要区别。
Gems只是一些代码,它为在代码中集成它的任何人提供了一系列function。
它包含:
- Gemspec
- Lib文件夹
可以打包并推送到RubyGems服务器
发动机实际上是gem。 所有引擎都可以是gem(如果打包)但并非所有gem都是引擎。
我们可以用不同的词来说,Engines是一个Ruby on Railsfunction,它可以包含特定于Rails的实体:模型,控制器,视图,迁移。
它需要集成在Rails应用程序中,不能自行运行。
非常好,快速阅读Artricle