`
fireflyman
  • 浏览: 118256 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

rake任務詳解

    博客分类:
  • ROR
阅读更多
Rake简介

Rake是啥子?

Rake的意思是Ruby Make,一个用ruby开发的代码构建工具.

但是,为什么Ruby需要Rake?

    按理说Ruby代码无需编译,应该不需要Rake才对呀?原来,Rake另有妙用,即把Rake当做一个任务管理工具来使用...这样做有两个好处:

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

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

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

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

下面入正题吧,即如何用Rake编写一个任务脚本..

Rake脚本编写

先来个简单的例子,如下:

假设你是一个火星成员,老版本那些,即如燕儿虎跑之类的,在周末你打算去车车那边打火锅,然后集体PC去.对应这个情况,你需要为自己制定三个任务:搭车找车车、烤鱼和网吧PC.用vim创建创建一个名叫rakefile的文件(备注:Rake会在当前路径下寻找名叫Rakefile、rakefile、RakeFile.rb和rakefile.rb的rake文件),并键入如下代码:

desc "任务1 -- 搭车去车车那里"#这据说是个苦差,因为太远了
task :busboy do
puts "发现挫男"
end

desc "任务2 -- 烤鱼"
task :bitchfish do
puts "老板,先烤九斤鱼"
end

desc "任务3 -- 网吧PC"
task :pc do
puts "我选中路"
end



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

D:\work>rake busboy
(in D:/work)
发现挫男

D:\work>rake bitchfish
(in D:/work)
老板,先烤九斤鱼

D:\work\ruby_works\ruby_book>rake laundry
(in D:/work)
我选中路


(备注:文字部分是没啥逻辑的,纯粹娱乐下...)

分析

相信看完上面那段东东,你已经知道怎么搞了...现在介绍些基础知识,方便加深理解.从上面的代码可以知道,此文件一共定义了3个任务,desc是Rake定义的方法,表示对下面定义任务的描述.这个描述会在使用Rake --tasks(或者Rake -T)命令时输出在屏幕上.

D:\work>rake --tasks
(in D:/work)
rake bitchfish #任务2 -- 烤鱼
rake busboy #任务1 -- 搭车去车车那里(这据说是个苦差,因为太远了)
rake pc 任务3 -- 网吧PC


task是Rake最重要的方法.它的方法定义是:task(args, &block).任务体是一个block,本例中只是简单输出你所要做的工作.需要注意的是代码

puts "发现挫男"


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

go..go..go..go..

接下来介绍下:依赖关系和命名空间

加入依赖关系

很显然,在我们定义的任务中,"烤鱼"是依赖于"搭车去车车那里"的(其它地方有没烤鱼吃不知道,反正地点就定在那了).那么,我们需要在我们的任务定义中加入这个依赖关系,修改后的文件如下:

desc "任务1 -- 搭车去车车那里"
task :busboy do
puts "发现挫男"
end

desc "任务2 -- 烤鱼"
task :bitchfish => :busboy do
puts "老板,先烤九斤鱼"
end

desc "任务3 -- 网吧PC"
task :pc do
puts "我选中路"
end



再次运行烤鱼任务,你会得到如下结果:
D:\work>rake bitchfish
(in D:/work)
发现挫男
老板,先烤九斤鱼


命名空间

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

namespace :dan do
desc "任务1 -- 搭车去车车那里"
task :busboy do
puts "发现挫男"
end
……
end



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

D:\work >rake --tasks
(in D:/work)
rake dan:bitchfish # 任务2 -- 烤鱼
rake dan:pc # 任务3 -- 网吧PC
rake dan:busboy # 任务1 -- 搭车去车车那里


你现在需要使用rake dan:bitchfish才能启动烤鱼这个任务了.
(BTW,你可以在你的rakefile中使用多个命名空间,对任务进行分类.)

了解了上面两个知识点后,我们来了解下两个具体实例:

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

当任务众多的时候,你很可能需要在一个任务中调用另外一个任务,假设我们把今天所有要做的工作定义为一个任务:today.在这个任务中,有两个任务需要被调用,一个是烤鱼,一个是网吧PC.当然,由于烤鱼依赖于搭车去车车那里,我们还是需要搭车去车车那里的.在文件的顶部定义一个today的任务:

desc "今天的任务"
task :today do
Rake::Task["dan:bitchfish"].invoke
Rake::Task["dan:pc"].invoke
end

namespace :dan do
……
end



可以看出,调用其它任务的方式很简单,只需要调用
Rake::Task["task_name"].invoke

方法就可以了.在命令行中启动rake today,可以得到:

D:\work >rake today
(in D:/work)
发现挫男
老板,先烤九斤鱼
我选中路


默认任务

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

task :default => [:today]


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

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

task :default => [:today]

desc "今天的任务"
task :today do
  Rake::Task["dan:bitchfish"].invoke
  Rake::Task["dan:pc"].invoke
end

namesoace :dan do
 desc "任务1 -- 搭车去车车那里(这据说是个苦差,因为太远了)"
 task :busboy do
   puts "发现挫男"
 end

 desc "任务2 -- 烤鱼"
 task :bitchfish do
   puts "老板,先烤九斤鱼"
 end

 desc "任务3 -- 网吧PC"
 task :pc do
   puts "我选中路"
 end
end


看完上面两个例子,估计rake任务就算全部了解了...其它都是些代码枪花罢了..多耍便是..

来看看我们的Rails源码吧...

Rails中的Rake任务

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

(对于上面文件夹里的*.rake任务经过上面的解析,相信要看懂应该不难了...自己看着办吧.)

参考文章:

Ruby中的Rake任务详述
http://hi.baidu.com/kenrome/blog/item/8caf71f0f6ffc7c07831aac9.html
分享到:
评论
14 楼 hexawing 2013-02-28  
相当好的入门级文章,收藏学习了!
13 楼 lfz8888666 2011-06-22  
多谢fireflyman,新学Rails,刚好不懂Rake相关的东西。
12 楼 4268146 2011-04-15  
这次真是学习了,谢谢呀,
11 楼 太平洋1986 2011-03-31  
简单易懂,学习了!
10 楼 obullxl 2011-03-23  
老板,再来一篇好文~~~
9 楼 yang_kunlun 2011-03-03  
MySpace 写道
老板 烤九斤鱼多少钱?

?什么意思啊
8 楼 alissa 2011-01-20  
开始学习写rake了,model中代码太冗余了
7 楼 275266625 2010-08-09  
讲的很清楚,学习了~~~
6 楼 MySpace 2010-08-03  
老板 烤九斤鱼多少钱?
5 楼 fireflyman 2010-08-03  
select*from爱 写道
哥很好奇,为什么你的代码里面不用繁体字

因為這是在家里寫的
4 楼 select*from爱 2010-08-03  
哥很好奇,为什么你的代码里面不用繁体字
3 楼 fireflyman 2010-07-29  
wyb222 写道
飞人……你给个稿费不

車車,等我去北京就請你們吃烤魚
2 楼 kenrome 2010-07-29  
浅显易懂,学rake就从你这篇文章开始了.
1 楼 orcl_zhang 2010-07-23  
现在都学堂桑了。
你写的,我之前在哪里看过,简直一模一样。
后来发现你下面的链接。。

相关推荐

    rake详解(清晰)

    Rake任务也可以接受参数,使得任务更具灵活性: ```ruby task :run, [:arg1, :arg2] do |t, args| puts "Running with arguments: #{args[:arg1]}, #{args[:arg2]}" end rake 'run[hello,world]' ``` 执行`rake ...

    Node.js-code-notes一个node.js版本的Rails的“rakenotes”功能

    它以生产力和简洁性著称,其中"rake"是Rails的一个任务执行工具,类似于Unix的make。 3. **“rake notes”命令**:在Rails中,"rake notes"是用于扫描代码中的特殊注释,这些注释以特定格式开头,例如`TODO:`、`...

    教学级Ruby On Rails 手动安装.pdf

    - **Rake**:用于自动化任务的构建工具,Rails项目中常用于执行特定任务。 - **Rails**:核心框架,本例中采用Rails 2.1.0。 - **数据库**:可选MySQL、PostgreSQL或SQLite等。 - **NetBeans IDE**:集成开发环境,...

    rails-angular-api-example-edit

    "bundle exec rake db:setup" 是另一个关键步骤,它会执行Rake任务来设置数据库。`rake`是Ruby中的一个任务执行工具,`db:setup`任务通常包括创建数据库、加载schema以及初始化数据填充等步骤。 **标签:"Ruby"** ...

    Ruby学习思维导图.pdf

    ### Ruby学习思维导图知识点详解 #### 一、基础知识 **1.1 变量与常量** - **局部变量**:以小写字母或下划线开头的变量,作用域仅限于定义它的方法或代码块。 - **全局变量**:以美元符号 `$` 开头的变量,在...

    halcon_算子函数合集

    ### HALCON算子函数合集知识点详解 #### 第一章:分类 本章节将详细介绍HALCON软件中的分类算法,主要包括高斯混合模型(Gaussian Mixture Models)、超盒(Hyperboxes)以及多层感知器(Neural Nets)三类算法。 ...

    Gitlab私有化部署管理

    ### GitLab私有化部署管理知识点详解 #### 一、环境搭建 在进行GitLab私有化部署前,首先需要了解具体的环境配置信息。 **1.1 阿里云环境** - **地址**: `http://xxx.xxx.xxx.xxx` - **备份目录**: `/mnt/gitlab...

    tisi-carbide-test:一个问题跟踪器,主要讲授一些Ruby on Rails概念

    7. Rake任务:Rake是RoR中的一个任务执行工具,类似Perl的Make或Python的setup.py。开发者可以定义自己的Rake任务,用于数据库迁移、测试、部署等各种工作流程。 8. 测试驱动开发(TDD):RoR鼓励TDD,通过编写测试...

    gitlab安装-配置-运维-使用详细说明

    3. 数据备份与恢复:定期执行`gitlab-rake gitlab:backup:create`进行备份,恢复时用`gitlab-rake gitlab:import:restore[BACKUP_FILE_PATH]`。 4. 监控与优化:GitLab内置了性能监控,可通过Web界面查看。根据监控...

    win2003下安装redmine2.1.4步骤-xp1204

    ### Windows 2003 下 Redmine 2.1.4 安装步骤详解 #### 知识点一:Redmine 概述 Redmine 是一个功能强大的、跨平台的项目管理和缺陷跟踪工具,适用于软件开发团队和其他需要项目管理功能的团队。它支持多种版本...

    Social-Media-react-Project:熨斗学校的最终项目

    在项目描述中提到,可以使用`rake start`命令运行项目,这意味着项目可能包含一个Rake任务,用于启动Rails服务器、预编译React资产等初始化工作,简化了项目的部署流程。 5. **文件结构分析** 社交媒体项目可能...

    puppet cookbook

    - Rake是一种Ruby脚本任务管理工具,可以用于自动执行常见的部署任务。 - **配置Puppet的文件服务器**(第13页) - 设置Puppet Master作为文件服务器,以提供配置文件和其他资源给客户端。 - **通过cron运行...

    gitlab备份恢复手册

    ### GitLab备份恢复手册知识点详解 #### 一、GitLab备份目录路径设置 GitLab的备份功能对于确保数据安全至关重要。正确配置备份路径是备份流程的第一步。 1. **配置备份目录路径** - 执行命令`vim /etc/gitlab/...

    win下安装redmine2.1

    Redmine 支持多项目管理、时间追踪、文件版本控制、任务分配等功能,并且可以通过插件扩展其功能。虽然 Redmine 支持多种语言,但在 2.1 版本中,中文支持并不完善。 #### 二、安装环境准备 为了确保 Redmine 能够...

    task-manager-react-rails:演示版

    《任务管理器ReactJS + Rails:构建与演示详解》 在现代Web开发中,ReactJS作为前端库,Rails作为后端框架,它们的结合能够构建出高效、动态且功能丰富的应用。本文将深入探讨如何利用ReactJS和Rails搭建一个任务...

    REDMINE操作手册

    它可以帮助团队更高效地管理项目进度、追踪任务完成情况,并提供强大的文档管理和时间追踪功能。由于其高度可定制化的特点,Redmine广泛应用于各种规模的团队和组织中。 #### 二、REDMINE安装步骤详解 **1. 准备...

    yab-rails:Yab的Rails应用

    10. `Rakefile`: 包含可执行的Rake任务,如 `db:setup`。 11. `README`: 项目介绍和说明,通常包括如何安装和运行应用的指南。 综合以上信息,"Yab-rails" 是一个使用Ruby on Rails构建的后端服务,主要目的是为iOS...

    docs-1.x:Papi 1.x的文档

    Rake 能够定义一系列的任务,并通过简单的命令调用执行这些任务。在 Papi 1.x 的上下文中,`rake publish` 可能会将生成的静态文件上传到指定的托管服务,如 GitHub Pages 或其他静态站点服务,使得你的 API 文档...

    Redmine安装实践

    ### Redmine安装实践知识点详解 #### 一、Redmine简介 **Redmine**是一款基于Web的项目管理和问题跟踪工具,采用Ruby on Rails (ROR)框架进行开发,支持跨平台运行,并兼容多种数据库系统。其设计初衷是为了解决...

Global site tag (gtag.js) - Google Analytics