- 浏览: 113386 次
- 性别:
- 来自: 火星
文章分类
最新评论
-
hexawing:
相当好的入门级文章,收藏学习了!
rake任務詳解 -
minn84:
...
2012目标 -
luopeng_sg:
请问LZ这用的是JRuby还是CRuby呢?
验证码生成插件simple_captcha -
orcl_zhang:
2套?有钱人。100本,貌似有点多。
2012目标 -
keating:
来捣乱
要有梦
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文件),并键入如下代码:
打开命令行工具,进入这个文件所在目录,然后运行下面的命令,大致应该类似如下结果:
(备注:文字部分是没啥逻辑的,纯粹娱乐下...)
分析
相信看完上面那段东东,你已经知道怎么搞了...现在介绍些基础知识,方便加深理解.从上面的代码可以知道,此文件一共定义了3个任务,desc是Rake定义的方法,表示对下面定义任务的描述.这个描述会在使用Rake --tasks(或者Rake -T)命令时输出在屏幕上.
task是Rake最重要的方法.它的方法定义是:task(args, &block).任务体是一个block,本例中只是简单输出你所要做的工作.需要注意的是代码
完全是一个普通的Ruby语句,puts是Ruby中进行输出的一般性方法,可以看出,Rake任务可以完全使用Ruby的能力,这使得它非常强大.
go..go..go..go..
接下来介绍下:依赖关系和命名空间
加入依赖关系
很显然,在我们定义的任务中,"烤鱼"是依赖于"搭车去车车那里"的(其它地方有没烤鱼吃不知道,反正地点就定在那了).那么,我们需要在我们的任务定义中加入这个依赖关系,修改后的文件如下:
再次运行烤鱼任务,你会得到如下结果:
命名空间
跟任何编程语言类似,当你的rake文件很多时,当你有很多任务的时候,你需要关注它们的命名冲突问题,命名空间(namespace)就是一个自然的解决方案.你可以为上面的三个任务定义一个叫做dan的命名空间.
再次运行rake --tasks,你会得到如下的结果:
你现在需要使用rake dan:bitchfish才能启动烤鱼这个任务了.
(BTW,你可以在你的rakefile中使用多个命名空间,对任务进行分类.)
了解了上面两个知识点后,我们来了解下两个具体实例:
在一个任务中调用另外一个任务
当任务众多的时候,你很可能需要在一个任务中调用另外一个任务,假设我们把今天所有要做的工作定义为一个任务:today.在这个任务中,有两个任务需要被调用,一个是烤鱼,一个是网吧PC.当然,由于烤鱼依赖于搭车去车车那里,我们还是需要搭车去车车那里的.在文件的顶部定义一个today的任务:
可以看出,调用其它任务的方式很简单,只需要调用
方法就可以了.在命令行中启动rake today,可以得到:
默认任务
可以为Rake增加一个默认任务,这样可以简单地用Rake命令来触发这个默认任务,在上面的rakefile中,我们可以用如下方式把"today"任务作为默认任务.
然后调用直接在命令行中调用rake,可以得到跟调用rake today同样的输出结果.
这就是我们简单的一个Rake任务定义,下面是完整的修改后的rakefile:
看完上面两个例子,估计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
?什么意思啊
因為這是在家里寫的
車車,等我去北京就請你們吃烤魚
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
现在都学堂桑了。
你写的,我之前在哪里看过,简直一模一样。
后来发现你下面的链接。。
你写的,我之前在哪里看过,简直一模一样。
后来发现你下面的链接。。
发表评论
-
快闪行动-->为你的项目添加标签模块
2011-04-23 16:44 1130在开始之前,还是要不厌其烦的说说,那些不必要写的你自己搞把,反 ... -
Paperclip在Windows下的那些Po事
2011-04-02 04:22 12681.Paperclip提示command is not rec ... -
FireBug实用指南
2011-03-28 00:14 1322古语有云:工欲善其事必先利其器.对于Web开发人员来说, ... -
在或不在
2011-02-13 23:58 0我在我的路上停止了脚步,为的是走一条新的路...没有人明白我的 ... -
验证码生成插件simple_captcha
2011-01-12 23:37 1864插件地址:https://github.com/eshopwo ... -
关于Mar's shoe的创意思考
2011-01-12 00:52 987在昨天我的一个伙 ... -
ruby各种小脚本(集装箱)
2010-12-01 03:32 1763有时候听歌听的入迷了,就想下载google的歌词,可是下下来总 ... -
我是rails插件控
2010-12-01 03:01 0有些问题总是有点疑惑,既然能够用插件解决,为啥要自己写呢?反正 ... -
豆瓣“我说”功能的rails简单实现
2010-11-30 23:07 011111 -
用rails开发新版的起点中文网
2010-11-30 23:06 011111 -
用rails实现简单邮件发送测试
2010-11-02 17:53 1433我的环境是ruby1.8.7, rails ... -
工作中遇到的Aajx
2010-10-30 10:22 01.ObjectRange $A($R(1,5)).join( ... -
后台订单处理提醒功能
2010-10-26 17:31 01.参考豆瓣提醒 2. 用户<%= link_to&qu ... -
工作遇到的图片问题
2010-10-26 11:09 0<% record = shirt_window %&g ... -
工作中遇到的JS
2010-10-26 10:17 01.getElementById() 方法可返回对拥有指定 I ... -
页面代码
2010-10-25 13:08 0<% record = shirt_window %&g ... -
工作中遇到的CSS
2010-10-24 20:13 01.cursor 属性规定要显示的光标的类型(形状). 引用 ... -
工作小记
2010-10-19 18:50 01.svn commit 提交要注意别把别人的代码冲走了.. ... -
問答頻道模塊開發
2010-10-12 09:22 0直接參考JE的問道頻道.... -
草稿箱的崛起...
2010-09-30 16:51 0你懂个P啊...
相关推荐
limerick_rake, 有用的rake任务集合 Rake有用的rake任务集合。要在 Rails 应用程序中使用,请在你的Gemfile中:gem 'limerick_rake'禁止我们不再使用 limerick_rake,因此不再维护它。 如果你想接管这个
rake详解
betabuilder, 一组Rake任务,用于管理和分发iOS临时构建 BetaBuilder,用于管理iOS特殊构建的gemBetaBuilder是用于管理和发布iOS应用程序的特殊构建的Rake任务和实用程序的简单集合。如果你正在寻找OSX的BetaBuilder...
Traceroute一个Rake任务,帮助你找到Rails 3 应用中堵死的路线和未使用的actions
bower-rails, 在 Rails 上,为 Bower 设置类似 DSL + rake任务 rails Bower 对 Rails 项目的支持。 依赖文件是 Rails root 目录中的bower.json,如果使用 DSL,则为 Bowerfile 。 查看最新变更和发布的变更日志文件...
使用halcon进行测量,使用的是rake算子;使用halcon进行测量,使用的是rake算子;
OpsWorks Rails 命令行手册 本说明书适用于在 Amazon Web Services OpsWorks 堆栈上使用 Ruby on Rails 的... 这既费力又容易出错,因此这些方法通过创建 rake 任务来解决这个问题,这些任务已经嵌入了部署数据中的环
耙子::波浪号当文件更改时运行 rake 任务。 无需对 Rakefile 进行任何更改,只需在任务名称前添加 ~ 如: $ rake ~build安装将此行添加到应用程序的 Gemfile 中: gem 'rake-tilde' 然后执行: $ bundle或者自己安装...
require 'rubygems/tasks'Gem::Tasks.new哲学用于管理Ruby项目的Rake任务不应与用于创建项目的项目生成器耦合。 项目生成器与用于构建,安装和发布Ruby项目的Rake任务无关。 最近,许多Ruby开发人员开始手动创建...
RAKE接收技术是第三代CDMA移动通信系统中的一项重要技术。在CDMA移动通信系统中,由于信号带宽较宽,存在着复杂的多径无线电信号,通信受到多径衰落的影响。RAKE接收技术实际上是一种多径分集接收技术,可以在时间上...
rake接收机仿真程序,包括多个仿真
针对异地通信网络的3G最佳接收机matlab程序。设计的三种RAKE接收机程序。非常实用。
rake工具是用来检测直线的,通过鼠标画一条线,然后工具根据已设定好的参数去附近区域寻找并拟合直线,返回这条直线。两条直线就可以计算交点了。 rake工具封装了三个函数来完成,代码不少,下面我就来展示详细的...
Traceroute¶↑Rake任务,可帮助您在Rails 3+应用程序中查找死路线和未使用的动作。 功能¶↑此Rake任务调查Rails应用程序的路由定义,然后向您显示未使用的路由。Traceroute¶↑Rake任务可帮助您在Rails 3+应用程序...
Rake任务的build任务包含3个参数(如下所示),并调用适当的API调用以启动构建。 build Rake任务参数 储存库名称 建分公司 以空格分隔的参数列表以覆盖构建 用于过滤作业的字符串。 该字符串应为等号分隔的键值对的...
这将启用 Web 控制台 REPL 上的调用 Rake 任务。 投屏 安装 将此行添加到应用程序的 Gemfile 中: gem 'web-console-rake' 然后执行: $ bundle 或者自己安装: $ gem install web-console-rake 用法 您可以...
构建脚本收集在构建期间使用的rake任务。nuget_push 任务list_nuget_packages用于列出nuget.org中未更新的Open Systems药理学软件包。 这在nuget开发人员将软件包推送到Appveyor提要并且所有软件包的稳定版本应复制...
rake for rails rake-0.8.7安装rails必须资源
伊斯雷克尔 这个 gem 是 rake 任务的集合,用于在 Mac OS 上维护 iPhone 模拟器的常见任务,例如...... 更改 iPhone 模拟器的首选项更改 iPhone 模拟器的语言重置 iPhone 模拟器启动 iPhone 模拟器停止 iPhone ...
cape:为Rake任务动态生成Capistrano配方-源码