下面是咱们使用Rake任务的例子:
一、给列表中的用户发送邮件
二、每晚数据的计算和报告
三、过时或从新生成缓存
四、备份数据和svn版本(how's this : subversion repository)
五、运行数据处理脚本(sort of,how much is called this )
六、Pouring drinks to get a good buzz on(一句玩笑,是这两位仁兄的风格)
这篇文章中,咱们将讨论为何要建立Rake,和他怎么样帮助咱们的rails应用。最好你能够写本身的Rake。
1、历史回顾:make
为了了解Rake的来历,咱们先了解一下Rake的爷爷:Make。
让咱们回到那个代码块须要编译,解释性语言和iphone还没出如今地球上的时代。
回到那时,咱们下载的大型程序,仍是一堆源代码和一个shell脚本。这个shell脚本包含了全部须要用来compile/link/build的代 码。你须要运行“install_me.sh”这个脚本,每一行代码将被运行(编译每一行源文件),而后生成一个你可以运行的文件。
对于大多数人这样是不错的,可是对于程序开发人员倒是一个不幸。每次你对源代码进行一个小的改动,并进行测试的时候,你须要回到shell脚本,并从新编译全部的源代码,显然对于大的程序“那是至关的”耗时的。
1977年,贝尔实验室的Stuart Feldman创造了“make”。解决了编译时间过长的问题。Make用来编译程序,取得两方面的进步:
Stuart Feldman
(1)Make能够发现哪一个文件在上一次编译后改动过,根据这点,再次运行Make时,仅编译改动过的文件。这个很大程序上减小了从新编译大型程序的时间。
(2)Make能够进行从属跟踪。你能够告诉编译器,源文件A的编译须要源文件B,源文件B的编译须要源文件C,因此Make在编译A时发现B没有编译,将会先编译B。
能够这样定义:Make是一个可执行程序。像ls或dir同样。让Make理解如何让编译一个项目,须要建立一个makefile文件,描述全部的源文件和依赖关系。makefiles有本身的语法,你不用去了解。
这些年Make出现了其余的变体,而且被其余的语言使用。事实上,ruby用户在rake出现前也在使用它。
“可是,ruby并不须要编译,咱们用它来干吗?”
是啊。ruby是一个解释性语言,咱们不须要编译它的源代码,因此ruby程序员为何使用它呢?
两个重要的缘由:
(1)建立任务
在大型的应用中,你常常编写脚本,在命令行下运行一些任务。好比清除缓存,维护任务,或者迁移数据库。你能够写一个MakeFile来组织你的任务,而不是写十个不相干的脚本(或者一个复杂的)。这样你能够简单的运行:“make stupid”。
(2)从属任务跟踪
当你开始写一些维护任务的时候,可能发现有些任务的使用可能有重复。好比,“migrate”任务和“schema:dump”都须要连接数据库,这样我 能够建立一个任务"connect_to_database",使“migrate”和“schema:dump”都依赖 于"connect_to_database",这样下次运行“migrate”时,"connect_to_database"会先于 “migrate”运行
2、如何获得Rake
几年前,Jim Weirich在一个java项目上使用了Make,他发现若是在他的Makefile中写一小段ruby代码将会带来很是大的方便。因此他建立了Rake。
Jim 为Rake建立了任务功能,附属关系跟踪,甚至建立了时间段判断(timestamp recognition),(在上一次编译的基础上仅编译改动的部分),固然,对于ruby,咱们并不须要编译。
我很想知道Jim在代码里作了什么,你也想知道吧。Jim可能历来没想给这个代码写个文档,可能如今他也是被烦透了,写了一个。呵呵
3、Rake如何工做
开始我想给这个部分起名为"How to get wasted with Rake"。
那么我想喝点酒,该怎么作呢?
一、去买酒
二、喝酒
三、喝醉
若是我要使用Rake完成这个任务,我会建立一个“Rakefile”文件:
task :purchaseAlcohol do
puts "Purchased Vodka"
end
task :mixDrink do
puts "Mixed Fuzzy Navel"
end
task :getSmashed do
puts "Dood, everthing's blurry, can I halff noth'r drinnnk?"
end 这样我能够在这个Rakefile的目录,分别运行这些任务:
$ rake purchaseAlcohol
Purchased Vodka
$ rake mixDrink
Mixed Fuzzy Navel
$ rake getSmashed
Dood, everthing's blurry, can I halff noth'r drinnnk? 酷!可是从顺序上看,我能够用任何的顺序运行这个任务。好比喝醉在买酒或者喝酒以前。固然这不符合人的习惯。
4、Rake的顺序
task :purchaseAlcohol do
puts "Purchased Vodka"
end
task :mixDrink => :purchaseAlcohol do
puts "Mixed Fuzzy Navel"
end
task :getSmashed => :mixDrink do
puts "Dood, everthing's blurry, can I halff noth'r drinnnk?"
end 这样,若是想喝酒,就得先去买,若是想喝醉,就得先喝酒。
$ rake purchaseAlcohol
Purchased Vodka
$ rake mixDrink
Purchased Vodka
Mixed Fuzzy Navel
$ rake getSmashed
Purchased Vodka
Mixed Fuzzy Navel
Dood, everthing's blurry, can I halff noth'r drinnnk? 看到了吧,我喝醉和,由于酒已经买了,也被我喝了。(译者:我是喜欢百事的,因此假若我写,定然拿百事当例子。可是我让我儿子和可口,为何呢?下面告诉你。)
如今,你的欲望没法知足了,你想让你的朋友加入进来。就像一个团队的开发,若是你想加入一个新人,你得有合适的规划。你得有文档。那么问题来了。
5、如何给个人Rake添加文档
Rake添加文档很是的方便,使用“desc”就能够了:
desc "This task will purchase your Vodka"
task :purchaseAlcohol do
puts "Purchased Vodka"
end
desc "This task will mix a good cocktail"
task :mixDrink => :purchaseAlcohol do
puts "Mixed Fuzzy Navel"
end
desc "This task will drink one too many"
task :getSmashed => :mixDrink do
puts "Dood, everthing's blurry, can I halff noth'r drinnnk?"
end 看到了吧,个人每一个任务都添加了desc,这样咱们能够输入"rake -T"或者"rake --tasks":
$rake --tasks
rake getSmashed # This task will drink one too many
rake mixDrink # This task will mix a good cocktail
rake purchaseAlcohol # This task will purchase your Vodka 简单乎?呵呵
6、Rake的命名空间
当你开始酗酒,而且开始使用大量的rake任务的时候,你须要一个好方法将他们分类,这时用到了命名空间,若是我在上面的例子使用了命名空间,那么:
namespace :alcoholic do
desc "This task will purchase your Vodka"
task :purchaseAlcohol do
puts "Purchased Vodka"
end
desc "This task will mix a good cocktail"
task :mixDrink => :purchaseAlcohol do
puts "Mixed Fuzzy Navel"
end
desc "This task will drink one too many"
task :getSmashed => :mixDrink do
puts "Dood, everthing's blurry, can I halff noth'r drinnnk?"
end
end 命名空间容许你将一些任务放到特定的分类中,在一个Rakefile中,你能够加入几个命名空间。运行rake --tasks
rake alcoholic:getSmashed # This task will drink one too many
rake alcoholic:mixDrink # This task will mix a good cocktail
rake alcoholic:purchaseAlcohol # This task will purchase your Vodka 因此若是想运行这个任务,只要输入 rake alcoholic:getSmashed:
7、如何写一个有用的ruby任务
最近,我想用ruby建立几个文件夹:
desc "Create blank directories if they don't already exist"
task(:create_directories) do
# The folders I need to create
shared_folders = ["icons","images","groups"]
for folder in shared_folders
# Check to see if it exists
if File.exists?(folder)
puts "#{folder} exists"
else
puts "#{folder} doesn't exist so we're creating"
Dir.mkdir "#{folder}"
end
end
end 固然,还能够在rake中使用更多的 文件工具File Utils,或者加入其余的部分。
8、如何为个人rails应用写一个Rake任务
一个rails应用中,已经有了一些rake任务,你能够在你的项目目录里运行:rake --tasks。
为了给你的rails应用添加一个新的任务,你能够打开/lib/tasks目录(已经存在的),添加一个叫something.rake的文件,这个任务会被自动的检索到,这些任务会被添加到rake tasks列表中,你能够在根目录里运行他们,如今把咱们上面的例子放到这个rails应用中。html