关于Gem包的认识和实践
缘起
现代社会,是一个信息爆炸的时代。何为爆炸,那就是每天,每时,每刻,都可能有海量的信息向你潮涌而来,将你淹没,个人如同一叶扁舟般,在波涛汹涌的海面上,随波逐流,不知所措。
其实,我表达的是,软件技术的Demo总是简单的,而现实世界的应用程序确是庞大复杂的。比如,Rails的应用程序,小小的应用程序居然用到了各种各样的Gem包,搞的我不知从哪个开始下手。为此,一个一个来,一步一个脚印,慢慢的总结。
Gem包按类型分两种: 功能类gem包和资源类gem包。备注: 资源类的gem包存在的意义是,可以通过bundle对js/css这样的资源进行管理,如同javascript中bower提供的功能那样。
模型的GEM包
模型同数据库关系密切,数据库简单则模型简单,数据库复杂,模型也简单不到哪里去。这个世界上的数据库管理软件实在太多,太多的选择导致复杂的数据库环境,从而提升了软件的复杂度,最直观的表现就是依赖很多GEM包:
数据库相关
- mysql2: mysql 到ruby的驱动
- mongoid, Mongoid是一个MongoDB的Ruby ODM(Object-Document-Mapper,对象文档包装器)封装,Mongoid的设计目的是为那些使用了Ruby的ActiveRecord 或 Data Mapper 的开发者提供方便的MongoDB操作接口,即提供与ActiveRecord类似的数据库访问接口。
- mongoid_time_field, mongodb的时间类型驱动
- carrierwave-mongoid, carrierwave的mongodb的支持,与mongodb的GridFS(存储大文件的数据类型)系统工作,具体是为应用程序提供上传文件的功能。
- mongoid_slug, 对基于mongodb的模型,生成插入的或永久链接的URL。
mongo_followable
, 为Mongoid和Mongo_Mapper添加follow特性,具体的,可能是为了网站中的用户建立follow关系。- mongoid-tree, 使用物化路径模式的Mongoid的文档的树形结构。
- tenacity: 管理由不同的数据库支持的模型之间的管理,比如项目中涉及了很多不同的数据库(mysql、mongodb之类)时
- public_activity, 简单的模型追踪
- recommendable, 为Ruby/Redis应用程序使用喜欢/或这不喜欢的推荐机制,有点类似推荐系统的味道
- acts_as_tree, Rails的modal的插件
- rest-client, Simple HTTP and REST client for Ruby, inspired by microframework syntax for specifying actions.
Sunspot相关(与搜索相关的):
目前,我要弄明白其实现机制,然后,将其删除掉。
- sunspot_rails
- sunspot_solr
- sunspot_mongoid, 对接mongodb的sunspot驱动包
Solr是一种利用Java实现的通用搜索引擎,基于Apache Lucene的全文搜索服务器。此外,要在应用程序中使用Solr,需要提供特定的配置文件。此外,Solr依赖java开发环境。
权限相关
- devise, 灵活的基于warden(通用的基于Rack的权限框架)的授权解决方案。
特点:
- Is Rack based;
- Is a complete MVC solution based on Rails engines;
- Allows you to have multiple models signed in at the same time;
- Is based on a modularity concept: use just what you really need.
- devise-async, # 相应的同步解决方法。
- omniauth, omniauth是一个使用Rack中间层的灵活的授权系统。
- omniauth-weibo-oauth2, 微博授权
- omniauth-qq-connect, qq授全
- omniauth-linkedin-oauth2, linkin授权
auth授权是国际认可的授权解决方案,对外提供的商业api都需要使用该授权。具体而言,看到了网易有道云笔记使用了该授权。
图像处理相关
- mini_magick, 和ImageMagick类似,是其的轻量级对手,主要是图像处理相关的。
文档处理相关:
- roo, 1.10.1 Roo provides an interface to Open Office, Excel, and Google Spreadsheets。解决一些需要将Excel文档导入数据库的需求。
- pdf-reader, pdf阅读器
- pdftoimage, pdf转化为image的gem包, 用作PDF预览
- chinese_pinyin, 拼音
任务处理相关:
- resque, 很重要的,简介为:用于创建后台任务的基于Redis的Ruby库,其将任务放置到多个队列中,并用于随后的处理。
- capistrano-resque, 部署任务相关
- resque-scheduler, 任务安排相关。
- rufus-scheduler, ruby的任务安排
- resque_mailer, 邮件任务
- resque-loner, 支持在resque中的特殊任务
Resque存在对应替代者,Sidekiq(简单的,有效的后台处理Gem包,号称1个进程干了20 Resque进程的活)。 Sidekiq项目地址: https://github.com/mperham/sidekiq , 项目地址: http://mperham.github.io/sidekiq/
通用配置
- configatron, 配置,强大的,简单的,特性丰富的配置系统。
- settingslogic, 直观的简洁的方式,将erb嵌入到yaml中。
- sanitize, 基于白名单的HTML和css的 ruby 洗手液。RubyWhitelist-based Ruby HTML and CSS sanitizer.
- ckeditor, 编辑器
- nokogiri, Nokogiri (鋸) is an HTML, XML, SAX, and Reader parser with XPath and CSS selector support
- xmpp4r, 0.5 A XMPP/Jabber library for ruby,两种IM通信协议的ruby包,可用来实现聊天功能
- rubyzip, ruby的压缩软件包
网站的GEM包
通用配置
- rails, rails gem包,可指定的Rails的版本,是RoR应用程序中最重要的Gem包
- rails-i18n, rails国际化相关的工作,主要就是一些文件之类的。地址: https://github.com/svenfuchs/rails-i18n
- mysql2, mysql的ruby驱动
技巧: 在Gemfile中,通过group :name do …. end为不同环境设置不同的Gem包下开发
assets分组
- sass-rails, Ruby on Rails stylesheet engine for Sass(Sass stylesheet language),配置文件为config.sass。网站:https://github.com/rails/sass-rails
- coffee-rails, CoffeeScript adapter for the Rails asset pipeline。网站:https://github.com/rails/coffee-rails
- turbo-sprockets-rails3, 通过只编译修改的文件来加速你的Rails 3的assets的预编译,并且,编译一次生成所有的asset。网站:https://github.com/ndbroadbent/turbo-sprockets-rails3
- uglifier, >= # Ruby wrapper for UglifyJS JavaScript compressor(压缩器),用来解析,美化,压缩JavaScript代码(NodeJS),网站:https://github.com/mishoo/UglifyJS
- therubyracer # 将V8 JavaScript引擎嵌入到Ruby。网站地址: https://github.com/cowboyd/therubyracer
- less-rails #The dynamic stylesheet language for the Rails asset pipeline, 由于项目中引入了Bootstrap,所以需要使用该Gem包。网站:https://github.com/metaskills/less-rails
- hogan_assets #使用hogan.js在sprockets以及Rails asset pipeline 上编译mustache模板(templates语言), hogan.js就是Mustache的模板编译语言。
- closure-compiler # A Ruby Wrapper for the Google Closure Compiler,这也是一个javaScript相关的gem包, 用来编译压缩JavaScript。closure-compiler本身是用java写的。官方地址:https://github.com/documentcloud/closure-compiler
备注: Rails asset pipeline和sprockets相关。在使用Rails生成的项目中,这样的的几个Gem包是默认的存在的:sass-rails、coffee-rails、uglifier。
思考: 最近想要在Rails中大量的应用Ajax效果,买了几本书《Rails之道》和《Ajax on Rails》,发现其上都在介绍如何使用RJS。昨天,克隆下GitLab的代码, 浏览了一下其中的路径和文件名, js相关的文件名: js.erb, js.coffee, js.haml,其中模板大多以html.haml为主。程序是写给人看的,所以,语法的简介很重要。
rack相关
- rack
- rack-cache
- rack-mount
- rack-test
- rack-rewrite : Rack层实现URL重写。
staging部署
- rvm-capistrano, RVM和cap集成的包,地址:https://github.com/wayneeseguin/rvm-capistrano
development分组
quiet_assets
, 改变assets pipeline记录消息。地址:https://github.com/evrone/quiet_assetsdebugger
, 在github上只看到了Ruby-debug以及pry-debugger, 其中pry-debugger的描述中有提到debugger这个包,感觉不是很有用。- annotate, 用来给ActiveRecord中的模型添加注释的gem包,地址: https://github.com/ctran/annotate_models
better_errors
, 为Rack应用程序提供更好的错误页,用来代替Rails提供的错误页面,使用过的效果确实相当的不错。地址:https://github.com/charliesome/better_errorsbinding_of_caller
, C编写的,用来在MRI虚拟机中检索方法的调用序列。地址:https://github.com/banister/binding_of_caller- meta_request # 从Rails Panel(Rails开发的Chrome扩展)中提出的gem包,不知有何用处
newrelic_rpm
, 一个Rails的性能监视工具,主要可以获取服务器的数据库访问的性能newrelic_moped
, 插桩工具,检测代码覆率,地址:https://github.com/stevebartholomew/newrelic_moped
test分组
rspec-rails
, rspec-rails是一个单元测试框架,专为Rails3和Rails4设计,功能类似Test::Unit,属于行为测试框架。地址:https://github.com/rspec/rspec-railsfactory_girl_rails
, 这是一个fixture replacement,主攻测试部分的。database_cleaner
, 在Ruby中清除数据库的策略,用来创建干净的测试环境,对一部分测试很有用。网站地址: https://github.com/DatabaseCleaner/database_cleaner
备注: 可以通过path和git选项了设置gem包, 以Ruby语法的角度来看,gem其实就是个方法调用。
assets pipeline相关(特别是jQuery)
- jquery-rails, 在Rails 3中自动使用JQuery的gem包,地址:https://github.com/rails/jquery-rails
- jquery-ui-rails, jQuery UI for the Rails 3.1+ asset pipeline,地址: https://github.com/joliss/jquery-ui-rails
- twitter-bootstrap-rails, Twitter Bootstrap for Rails 3.x - 4 Asset Pipeline,网站: https://github.com/seyhunak/twitter-bootstrap-rails
- bootstrap-kaminari-views, 和上面介绍的那个工具有关,网站:https://github.com/matenia/bootstrap-kaminari-views
- kaminari, A Scope & Engine based, clean, powerful, customizable and sophisticated paginator for modern web app frameworks and ORMs,为web应用框架和orm提供分页工具,地址:https://github.com/amatsuda/kaminari
- select2-rails, 在Rails asset pipeline中集成Select2的JavaScript的库。网站: https://github.com/argerim/select2-rails
simple_form
, 使用一个简单的DSL从而使得表单的生成更加容易(不需要选项和标记)。地址: https://github.com/plataformatec/simple_form- jquery-atwho-rails, at.js的Ruby gem包。地址:https://github.com/ichord/jquery-atwho-rails
client_side_validations
, 客户端验证gem包,使得Rails 3.1 以上的程序更容易的验证,项目不再维护,地址: https://github.com/bcardarella/client_side_validationsclient_side_validations-mongoid
, 客户端验证的mongoid插件,项目不再维护,地址:https://github.com/dockyard/client_side_validations-mongoidclient_side_validations-simple_form
, simple_form的客户端验证插件,项目不再维护,地址:https://github.com/dockyard/client_side_validations-simple_formui_datepicker-rails3
, jQuery UI datepicker(日记选择器) integration for Formtastic, Simple Form and Active Admin,https://github.com/kristianmandrup/ui_datepicker-rails3best_in_place
, A RESTful unobtrusive jQuery Inplace-Editor and a helper as a Rails Gem,用作后台编辑, 利用jQuery和Ajax,依赖jQuery。地址:https://github.com/bernat/best_in_place- remotipart, # Remotipart is a Ruby on Rails geim enabling remote multipart forms (AJAX style file uploads) with jQuery,用作Ajax文件上传。地址: https://github.com/leppert/remotipart
- tagmanager-rails, Tag Manager for Rails asset pipeline。地址: https://github.com/tmaier/tagmanager-rails
思: 一直很好奇,jquery-rails这样的Gem包究竟是个啥。特地去Github上看了一下jquery-rails的介绍,简单来说,Gem包会在app/assets/javascripts/application.js中添加
//= require jquery
,然后,就可以在应用程序中直接使用jQuery,这其实就是资源类的Gem包的特征。
其他配置
- memcache-client, # 缓存客户端,这里在github上看到很多的不同的memcache的客户端,其中有个ruby相关的是高性能的工具。具体的地址为:https://github.com/search?q=memcache-client&type=Repositories&ref=searchresults 这里到底用的是哪个gem包,不是清楚
- rest-client, # Simple HTTP and REST client for Ruby, inspired by microframework syntax for specifying actions。官方地址:https://github.com/rest-client/rest-client。
- progress_bar, #小工具,Ruby的终端的进度条,用于在终端上运行长时间的任务,这里的长时间任务大概是下面的搜索。
- ransack, 基于对象的搜索,由Heroku(Ruby的云计算平台)公司开发,是对MetaSearch (灵活的简单的创建搜索框)的重写,
inherited_resources
, 加速开发并且使得控制器的继承所有的Restful动作,对于标准的Restful的动作,只需要include该Gem即可。不过该gem包已经被弃用了(https://github.com/josevalim/inherited_resources),原作者Rails 3以上的建议使用responders代替- gmail, A Rubyesque interface to Gmail, with all the tools youll need。简单来说,就是Ruby的Gmail接口。地址: https://github.com/nu7hatch/gmail
- whenever, Cron jobs in Ruby,感觉就像Ruby语法的corn任务,提供更清晰的语法来编写和部署corn任务。地址:https://github.com/javan/whenever
- daemons, 将脚本转换为控制的守护进程-生成服务器器时非常的有用,rubyforge已经关停了,该项目也是7年前的事情。地址:https://github.com/ghazel/daemons
exception_notification
, Rails的异常通知插件,地址:https://github.com/smartinez87/exception_notificationnas-yahoo_stock
, 雅虎股票数据的接口,用来抓取雅虎的股表。地址:https://github.com/nas/yahoo_stocksitemap_generator
, 使用了google的站图信息 地址:https://github.com/adamsalter/sitemap_generatorlazy_high_charts
, 提供简单扩展的方法使用HighCharts,地址:https://github.com/michelson/lazy_high_chartstophold_rack
, 用于统计的Rack的中间件,地址: https://github.com/tteng/tophold_rack- faye, Simple pub/sub messaging for the web,项目地址: https://github.com/faye/faye ,项目主页: http://faye.jcoglan.com/
- timeliness, Fast date/time parsing for the control freak. 地址: https://github.com/adzap/timeliness
- cancan, RoR的权限Gem包。 地址:https://github.com/ryanb/cancan
- wicked, 将控制器装换为向导,地址:https://github.com/schneems/wicked
服务器相关
关于web服务器,实在有太多的可以选择了。Ruby自带的web服务器: webrick,高速的Mongrel以及Mongrel cluster, Unicron,thin,REE和Passenger。
- thin, 快速的简单的Ruby的web服务器。地址:https://github.com/macournoyer/thin
- REE , 特地去看了一下,感觉没什么,地址为: http://www.rubyenterpriseedition.com/ 。获得了一个认识,Ruby的解释器的实现的相当的多。
性能和服务器的选择存在一定的关系,网站的响应慢也不仅仅简单的归结为服务器的原因,存在很多使得网站变慢的原因,所以,第一要素是,搜集数据,找到变慢的根本原因。搜集数据的第一要素是: 性能监视工具。
实践
better_errors
更好的错误提示的gem包,搭配binding_of_caller
使用,可以在页面中对局部变量进行查询和访问(即所谓的REPL环境)。
在自己的测试项目中,将better_errors
引入和剔除时,对同一错误的控制台输出和web界面的输出对比了一下:
-
使用了
better_errors
的输出:NameError - undefined local variable or method `base_path' for #<#<Class:0x00000004b67688>:0x00000004b1f9a0>: app/views/static_pages/home.html.erb:11:in `_app_views_static_pages_home_html_erb__3215013181751152336_32833860' actionpack (3.2.13) lib/action_view/template.rb:145:in `block in render' ... # 以下省略调用栈追踪的错误, 调用栈的信息可在控制台或web界面中查看,控制台信息更紧凑 Started POST "/__better_errors/22226880/variables" for 127.0.0.1 at 2014-12-11 09:14:58 +0800 # 服务器端接受post请求的值查询操作
-
Rails原生的错误输出:
ActionView::Template::Error (undefined local variable or method `base_path' for #<#<Class:0x00000003bf66e0>:0x000000034311d0>): 8: </h2> 9: <%= link_to "Sign up now" , signup_path ,class: "btn btn-large btn-primary" %> 10: <p>This view template is render by <%= "controller: #{controller_name} and action: #{action_name}" %></p> 11: <%= base_path %> 12: </div> 13: <%= link_to image_tag("rails.png", alt: "Rails"), 'http://rubyonrails.org/' %> app/views/static_pages/home.html.erb:11:in `_app_views_static_pages_home_html_erb__3217260100283971556_32923440' Rendered /home/xiajian/.rvm/gems/ruby-1.9.3-p547@tophold/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.0ms) Rendered /home/xiajian/.rvm/gems/ruby-1.9.3-p547@tophold/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.9ms) Rendered /home/xiajian/.rvm/gems/ruby-1.9.3-p547@tophold/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (6.0ms)
web界面的信息显示上,better_error
显示的信息更加的完善且完整。
thin
和thin类似的web服务器有: webrick, puma, mongrel, unicorn等。thin的使用意外的简单,在gemfile中添加后,rack会优先选择除了webrick以外的handler。
后记
因为选择太多而导致选择困难,所以,唯一的受限的选择,可以免去浪费在选择上的时间。所以,Ruby社区在web开发框架上,rails一枝独秀并不见得是件坏事。由于社区相对较小,需要集中力量。
傲娇的使用Disqus