I code it

Code and Life

Ruby开发中的一些工具及概念

加入新公司之后,一个最明显的感受就是要学到东西非常多,以前只能在工作之余研究的各种技术现在变成了主业。人们学习新技术最常用的方法就是类比,即人们总是将新的东西和已经掌握的技术进行比较,计算出差异,从而以最小的代价,理解最多的内容。但是在这里,好像很难使用到类比,因为太多的东西都是初次接触,这样需要花很大的代价来学习,但是可以为后续的学习创造类比学习的条件。

言归正传,之前理解中的ruby是这样的:它是一个动态弱类型的语言,支持多种范式的编程(面向对象,FP等),这些都和python很类似,而我对于python还算熟悉,甚至还用python做过一些小工具。但是,在真正学习之后,特别是看到实际项目代码的结构之后,才发现其中有很多的内容是很难与既有的技术类比的(当然,很可能是我自己大脑中可供类比的资源太少)。

这里列举几个对我个人比较新的概念及技术:rvm, gem, Rake, RSpec, Cucumber。

gem是指用ruby写成的软件包(应用程序或者库),一个gem就是一个独立的,可发布的包(有点像Java中的jar)。RubyGems是gem的管理器,用以管理各个gem的安装,同时RubyGems也表示一个用于发布/更新gem的服务器。多个gem可以组成一个gemset,用以将多个gem组织在一起,比如你的某个ruby项目需要用到第三方的gem,而且每个gem都有特定的版本,那么就可以将这些gem组织在一起,形成一个gemset。ruby的gem管理机制很像是linux下的包管理机制,如apt-get,yum等:有依赖计算,自动下载并安装的功能。

rvm是ruby-version-manager的简写,是一个ruby的版本管理工具,它支持你在多个ruby版本之间切换,如在你的app-1中,你使用了ruby的1.8版本,而在app-2中,使用了ruby的1.7版本,都可以通过rvm来进行管理。只需要在你的app的根目录下,创建一个.rvmrc的文件,其中制定需要的ruby版本及gemset的名称即可。gemset会保存在~/.rvm目录下。

通常来讲,你的应用目录下应该需要这样两个文件:Gemfile.rvmrc,其中Gemfile指定你的gem从何处下载,及需要哪些gem,以及这些gem各自的版本信息,而.rvmrc则配置你的ruby解释器的版本,以及Gemfile中定义的gemset中的gem保存在何处。

   1: source 'https://rubygems.org'
   2:  
   3: gem 'rails', '3.2.3'
   4: gem 'bootstrap-sass', '2.0.0'
   5: gem 'bcrypt-ruby', '3.0.1'
   6:  
   7: group :development, :test do
   8:     gem 'sqlite3', '1.3.5'
   9:     gem 'rspec-rails', '2.9.0'
  10: end

一个Gemfile的片段

   1: rvm --create use ree-1.8.7@my-gem-set

.rvmrc的片段,my-gem-set是一个自定义的gemset。

Rake类似于ruby下的Makefile,不过是用ruby语言自己写的,而且更方便一些,主要的功能和Makefile一样,用以计算依赖等。

RSpec是ruby下进行BDD的工具,用以从“业务角度”描述测试的场景,然后便于TDD的进行。

   1: require 'spec_helper'
   2:  
   3: describe "Static pages" do
   4:     subject { page }
   5:  
   6:     describe "Home page" do
   7:         before { visit root_path }
   8:         it { should have_selector('h1', :text =>; 'My application') }
   9:         it { should have_selector('title', :text =>; "My application title") }
  10:         it { should_not have_selector('title', :text =>; '| Home') }
  11:     end
  12: end

 

Cucumber也是ruby下BDD的工具,不过Cucumber面向的对象并不需要对技术有任何的了解,事实上cucumber的feature文件更像是自然语言写的文章。cucumber由feature文件(从纯业务的角度来描述应用程序应该具备的功能),step文件(step理解feature中的描述,并试图将这些描述转换成应用程序的逻辑),这个过程可能比较耗时,但是觉得值得一试,相信我,没有什么比完全通过测试的代码更令人放心了。

这里的每个主题都需要以一整篇或者一个系列来讨论,这里只是做一个大致的介绍,我会一边学习,一边将自己的理解整理出来。rspec和cucumber都已经有一些比较有意思的例子,rake的例子也正在整理,希望不会拖太长时间。

Comments