`
chinapkw
  • 浏览: 111324 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

rake

阅读更多

转自:http://blog.csdn.net/smilewater/archive/2007/07/09/1683808.aspx

http://tb.blog.csdn.net/TrackBack.aspx?PostId=1683808

Rake

Rake简介

RakeMakeAnt

Rake的意思是Ruby Make,一个用ruby开发的代码构建工具。Rake的英文意思是耙子,一种很朴实的劳动工具。真的是很贴切,Rake正是一个功能强大、勤勤恳恳的劳动工具。

Rake会经常跟C/C++领域的makeJava世界的Ant进行对照,事实上,它们有很多相似的地方。我们先来看一下makeant的历史。

make的出现是为了解决批量编译的问题。对于一个小型的项目来说,用一个脚本文件或者批处理命令来进行批量编译就已经足够好。但是对于大型的项目来说,仅仅为了少数几个文件的改变就全部重新进行一次编译无疑是耗时且不必要的。而且,在大型的项目中,往往会有很复杂的依赖关系。

Make的出现就是为了解决这两个问题,make有两个优点:

  1. Make了解自上次Make运行以来哪些文件发生了变化,它会仅仅编译那些发生变化的文件。

  2. Make会跟踪文件之间的依赖性,如果文件A依赖于文件B,那么如果两者都没有编译时,Make会首先编译文件B

Ant算是一个Java世界的make,它要比make年轻许多(想想make是出现在1972年吧),它除了支持批量编译之外,还支持单元测试、JavaDoc等任务。因此,AntJava世界中比Make更加流行。

但是,为什么Ruby需要Rake

Ruby代码不需要编译,为什么需要Rake?其实,与其说Rake是一个代码构建工具,不如说Rake是一个任务管理工具,通过Rake我们可以得到两个好处:

  1. 以任务的方式创建和运行脚本

当然,你可以用脚本来创建每一个你希望自动运行的任务。但是,对于大型的应用来说,你几乎总是需要为数据库迁移(比如Railsdb:migrate任务)、清空缓存、或者代码维护等等编写脚本。对于每一项任务,你可能都需要写若干脚本,这会让你的管理变得复杂。那么,把它们用任务的方式整理到一起,会让管理变得轻松很多。

  1. 追踪和管理任务之间的依赖

Rake还提供了轻松管理任务之间依赖的方式。比如,“migrate”任务和“schemadump”任务都依赖于 “connect_to_database”任务,那么在“migrate”任务调用之前,“connect_to_database”任务都会被执行。

在哪里可以获得Rake

Rake的主页是在http://rake.rubyforge.org/,在这里你可以获得Rake的简单介绍,API以及一些有用文档的链接。可以在http://rubyforge.org/frs/?group_id=50获得最新版的Rake,在作者写作时,最新版本是0.7.3

Rake脚本编写

一个简单脚本

Rake的脚本相当简单,下面用一个例子进行说明。假设你是一个勤劳的家庭型程序员,在周末你打算为你的家人做一些贡献。所以你为自己制定了三个任务:买菜、做饭和洗衣服。打开你的文本编辑器,创建一个名叫rakefile的文件(Rake会在当前路径下寻找名叫RakefilerakefileRakeFile.rbrakefile.rbrake文件),并输入如下内容:

ruby 代码
  1. desc "任务1 -- 买菜"  
  2. task :purchaseVegetables do  
  3. puts "到沃尔玛去买菜。"  
  4. end  
  5.   
  6. desc "任务2 -- 做饭"  
  7. task :cook do  
  8. puts "做一顿香喷喷的饭菜。"  
  9. end  
  10.   
  11. desc "任务3 -- 洗衣服"  
  12. task :laundry do  
  13. puts "把所有衣服扔进洗衣机。"  
  14. end  


打开命令行工具,进入这个文件所在目录,然后运行下面的命令,大致应该类似如下结果:

D:\work\ruby_works\ruby_book>rake purchaseVegetables
(in D:/work/ruby_works/ruby_book)
到沃尔玛去买菜。

D:\work\ruby_works\ruby_book>rake cook
(in D:/work/ruby_works/ruby_book)
做一顿香喷喷的饭菜。

D:\work\ruby_works\ruby_book>rake laundry
(in D:/work/ruby_works/ruby_book)
把所有衣服扔进洗衣机。


分析

很简单,也很易读,对吧。这个文件一共定义了3个任务,descRake定义的方法,表示对下面定义任务的描述。这个描述会在使用Rake --tasks(或者Rake -T,为懒人准备的快捷方式)命令时输出在屏幕上。

D:\work\ruby_works\ruby_book>rake --tasks
(in D:/work/ruby_works/ruby_book)
rake cook # 任务2 -- 做饭
rake laundry # 任务3 -- 洗衣服
rake purchaseVegetables # 任务1 -- 买菜


下面的语句定义了purchaseVegetables这个任务,taskRake最重要的方法。它的方法定义是:task(args, &block)。任务体是一个block,本例中只是简单输出你所要做的工作。需要注意的是代码

puts "到沃尔玛去买菜。"

完全是一个普通的Ruby语句,putsRuby中进行输出的一般性方法,可以看出,Rake任务可以完全使用Ruby的能力,这使得它非常强大。

加入依赖关系

很显然,在我们定义的任务中,做饭是依赖于买菜的(我相信大多数程序员在周末的冰箱里除了可乐没有别的)。那么,我们需要在我们的任务定义中加入这个依赖关系,修改后的文件如下:

ruby 代码
  1. desc "任务1 -- 买菜"  
  2. task :purchaseVegetables do  
  3. puts "到沃尔玛去买菜。"  
  4. end  
  5.   
  6. desc "任务2 -- 做饭"  
  7. task :cook => :purchaseVegetables do  
  8. puts "做一顿香喷喷的饭菜。"  
  9. end  
  10.   
  11. desc "任务3 -- 洗衣服"  
  12. task :laundry do  
  13. puts "把所有衣服扔进洗衣机。"  
  14. end  



再次运行做饭任务,你会得到如下结果:

D:\work\ruby_works\ruby_book>rake cook
(in D:/work/ruby_works/ruby_book)
到沃尔玛去买菜。
做一顿香喷喷的饭菜。


是的,你当然需要先买菜,谁让你是一个冰箱空空如野的程序员呢。

命名空间

跟任何编程语言类似,当你的rake文件很多时,当你有很多任务的时候,你需要关注它们的命名冲突问题,命名空间(namespace)就是一个自然的解决方案。你可以为上面的三个任务定义一个叫做home的命名空间。

namespace :home do
desc "任务1 -- 买菜"
task :purchaseVegetables do
puts "到沃尔玛去买菜。"
end
……
end


再次运行rake --tasks,你会得到如下的结果:

D:\work\ruby_works\ruby_book >rake --tasks
(in D:/work/ruby_works/ruby_book)
rake home:cook # 任务2 -- 做饭
rake home:laundry # 任务3 -- 洗衣服
rake home:purchaseVegetables # 任务1 -- 买菜


你现在需要使用rake home:cook才能启动做饭这个任务了。当然,你可以在你的rakefile中使用多个命名空间,对任务进行分类。

在一个任务中调用另外一个任务

当任务众多的时候,你很可能需要在一个任务中调用另外一个任务,假设我们把今天所有要做的工作定义为一个任务:today。在这个任务中,有两个任务需要被调用,一个是做饭,一个是洗衣服。当然,由于做饭依赖于买菜,我们还是需要买菜的(这一步是逃不过去的,呵呵)。在文件的顶部定义一个today的任务:

ruby 代码
  1. desc "今天的任务"  
  2. task :today do  
  3. Rake::Task["home:cook"].invoke   
  4. Rake::Task["home:laundry"].invoke   
  5. end  
  6.   
  7. namespace :home do  
  8. ……   
  9. end  

 

可以看出,调用其它任务的方式很简单,只需要调用Rake::Task["task_name"].invoke 方法就可以了。在命令行中启动rake today,可以得到:

D:\work\ruby_works\ruby_book >rake today
(in D:/work/ruby_works/ruby_book)
到沃尔玛去买菜。
做一顿香喷喷的饭菜。
把所有衣服扔进洗衣机。


默认任务

可以为Rake增加一个默认任务,这样可以简单地用Rake命令来触发这个默认任务,在上面的rakefile中,我们可以用如下方式把“today”任务作为默认任务。

task :default => [:today]

然后调用直接在命令行中调用rake,可以得到跟调用rake today同样的输出结果。

这就是我们简单的一个Rake任务定义,下面是完整的修改后的rakefile

ruby 代码
  1. task :default => [:today]    
  2.   
  3. desc "今天的任务"  
  4. task :today do  
  5. Rake::Task["home:cook"].invoke   
  6. Rake::Task["home:laundry"].invoke   
  7. end  
  8.   
  9. namespace :home do  
  10.   
  11. desc "任务1 -- 买菜"  
  12. task :purchaseVegetables do  
  13. puts "到沃尔玛去买菜。"  
  14. end  
  15.   
  16. desc "任务2 -- 做饭"  
  17. task :cook => :purchaseVegetables do  
  18. puts "做一顿香喷喷的饭菜。"  
  19. end  
  20.   
  21. desc "任务3 -- 洗衣服"  
  22. task :laundry do  
  23. puts "把所有衣服扔进洗衣机。"  
  24. end  
  25. end  



Rails中的Rake任务

Rails预定义了大量的Rake任务,在Rails应用的开发过程中,你想必已经在大量使用它们了。在Rails中,所有的Rake任务都放在rails目录的lib/tasks目录下(在作者的环境下是c:\ruby\lib\ruby\gems\1.8\gems\rails-1.1.4\lib\tasks\),所有的rake任务都以.rake作为后缀名,这些以.rake结尾的文件会被自动加载到你的环境中。你可以到一个已有的Rails工程根目录下键入rake --tasks,可以看到很多的rake任务已经为你整装待发了。

Rails中,最常使用的Rake任务之一是进行数据库的迁移(migration)。数据库迁移程序允许你使用Ruby脚本来定义数据库模式,而db:migrate就是进行这个工作的rake任务。下面我们来分析这个rake任务。

db:migrate任务

db:migrate任务存放在lib/tasks/databases.rake文件中。这个文件中定义了所有与数据库操作相关的任务,我们仅仅抽出db:migrate的定义:

namespace :db do
desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x"
task :migrate => :environment do
ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
end
……
end



分析

首先是命名空间的声明,migrate任务的命名空间是db。这也就是我们用db:migrate来引用它的原因。

下面是一个描述,说明该任务的功能是把定义在db/migrate目录下(相对于你的Rails应用程序的根目录)的迁移脚本迁移到数据库中,如果不指定VERSION的话,默认是最新版本,否则可以恢复到一个指定的版本。

接着是任务的定义,该任务依赖于enviroment任务,这个任务在misc.rake中定义,用来加载Rails的环境,它的定义相当简单:

task :environment do
require(File.join(RAILS_ROOT, 'config', 'environment'))
end


用来加载config/environment.rb文件,该文件会加载Rails工作所需要加载的环境。由于加载了这个环境,所以ActiveRecord对象现在可以使用,下面就是调用ActiveRecord::Migrator.migrate方法对每个db/migrate/下的脚本文件进行迁移。

最后会调用db:schema:dump任务,该任务的主要作用是产生db/schema.rb文件。该文件用来记录不同版本的数据库模式。这个任务的定义就在db:migrate任务下面不远的地方,有兴趣的读者可以自行进行分析。



分享到:
评论

相关推荐

    rake接收matlab仿真

    rake接收matlab仿真 rake接收(多径分集技术)是一种常用的信道分集技术,通过在接收端对信号进行分集和合并,以提高信道容量和抗干扰能力。Matlab仿真程序是使用Matlab语言编写的仿真程序,用于模拟rake接收机的...

    RAKE接收技术的Matlab仿真实验(附源码).docx

    RAKE接收技术是移动通信,特别是第三代CDMA(码分多址)系统中用来对抗多径衰落的重要手段。在CDMA系统中,信号的宽带特性导致了复杂的多径传播,这会严重影响通信质量。RAKE接收机利用了多径分集的原理,能够从时间...

    RAKE接收机程序,Rake接收机主要解决,matlab

    RAKE接收机是一种在无线通信系统中用于处理多径衰落信号的重要技术,尤其是在扩频码分多址(CDMA)系统中。它利用多径传播的特性,将来自不同路径的延迟信号分别进行接收和合并,从而提高信号的接收质量。在本压缩包...

    扩频多径信道下RAKE接收机的性能分析(matlab仿真)

    扩频多径信道下RAKE接收机的性能分析(matlab仿真) 本文主要研究了扩频多径信道下RAKE接收机的性能分析,通过使用MATLAB软件进行仿真,比较了不同的合并方式和分集重数对RAKE接收机性能的影响。 首先,文章介绍了...

    Rake接收机 Matlab程序仿真

    在无线通信领域,Rake接收机是一种用于处理多径衰落信道的高效接收技术,尤其是在扩频系统和CDMA(码分多址)系统中广泛应用。本篇将详细讲解Rake接收机的工作原理,结合Matlab进行仿真,并探讨分集接收与合并技术。...

    rake详解(清晰)

    **Rake详解** Rake是Ruby编程语言中的一个构建工具,类似于Java的Ant或Python的setup.py。它提供了一个框架来定义和执行构建任务,使得开发者可以方便地管理项目中的各种自动化任务,如编译代码、运行测试、清理...

    rake-0.8.7.tgz

    《rake-0.8.7:Rails开发中的不可或缺的工具》 在Ruby on Rails(简称Rails)这个强大的Web开发框架中,rake扮演着至关重要的角色。标题中的"rake-0.8.7.tgz"是一个压缩包,包含了rake的一个特定版本——0.8.7,它...

    基于Halcon,鸟叔的spoke和rake函数

    在本主题中,我们聚焦于"基于Halcon,鸟叔的spoke和rake函数",这两个函数是鸟叔(一位在机器视觉社区中有影响力的专家)针对Halcon进行的特定封装,以帮助用户更方便地进行边缘检测和圆形特征的查找。 首先,让...

    Halcon——rake_测量

    使用halcon进行测量,使用的是rake算子;使用halcon进行测量,使用的是rake算子;

    Rake接收机性能仿真(与非Rake接收机对比).pdf

    RAKE接收机是一种在CDMA(码分多址)移动通信系统中用于对抗多径衰落的重要技术。它通过在时间域中分离并合并多径信号来提高接收性能。Rake接收机的基本思想是对到达的不同路径上的信号进行独立处理,然后以某种方式...

    rake接收机程序

    RAKE接收机是一种在无线通信系统中,特别是用于3G(第三代)移动通信网络中的关键技术。它主要用于CDMA(码分多址)系统,通过利用多径传播的优点来提高信号的接收质量和系统的容量。RAKE接收机的工作原理是将来自...

    RAKE关键词提取python代码

    RAKE(Rapid Automatic Keyword Extraction)算法是一种快速自动关键词抽取的方法,主要应用于文本摘要和信息检索领域。在Python中实现RAKE算法可以帮助我们从大量文本数据中高效地提取出关键主题词,这对于数据分析...

    rake接收机的基本原理

    "RAKE 接收机的基本原理" RAKE 接收机是 CDMA 扩频系统中的一种经典的分集接收器,其原理是基于多径信号的自相关特性。CDMA 扩频码在选择时就要求它有很好的自相关特性,使得信道带宽远远大于信道的平坦衰落带宽。 ...

    Matlab的rake接收机仿真-rake接收机仿真.doc

    Matlab 的 Rake 接收机仿真 Rake 接收机是一种能分离多径信号并有效合并多径信号能量的最终接收机。瑞克技术既不同于均衡,也不同于分集,它由多径分离和多径合并两部分组成。瑞克的概念是由 R.Price 和 P.E.Green ...

    短波通信中的Rake接收技术

    "短波通信中的Rake接收技术" 短波通信中的Rake接收技术是指在短波扩频通信中,利用多径信号的有效能量提高输出信噪比,改善短波通信质量的技术。该技术可以将多径信号进行识别和分离,提高接收信号的信噪比,达到...

    自定义rake工具.zip

    rake工具是用来检测直线的,通过鼠标画一条线,然后工具根据已设定好的参数去附近区域寻找并拟合直线,返回这条直线。两条直线就可以计算交点了。 rake工具封装了三个函数来完成,代码不少,下面我就来展示详细的...

    matlab rake

    标题中的“matlab rake”指的是使用MATLAB编程实现的RAKE接收机,这是一种在无线通信系统中常用于多径衰落信道下的信号接收技术。RAKE接收机通过合并来自不同传播路径的信号副本,有效地利用了多径分集,从而提高...

    CDMA_RAKE_CDMARake接收机_

    Rake接收机是CDMA系统中的核心组件,尤其在多径传播环境下,它能有效地提高信号接收性能。 CDMA Rake接收机的工作原理基于多径传播现象,即无线信号在传播过程中会经过多个路径到达接收端,形成多个延迟和幅度各异...

Global site tag (gtag.js) - Google Analytics