Ruby中任务构建工具rake的入门

2019年11月20日 阅读数:300
这篇文章主要向大家介绍Ruby中任务构建工具rake的入门,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

不一样的rake文件当中不要定义重名的方法,否则无法调用数据库

 

参考:http://www.jb51.net/article/81476.htm编程

Rake简介vim

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

可是,为何Ruby须要Rake?ruby

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

1.以任务的方式建立和运行脚本编程语言

   固然,你能够用脚原本建立每个你但愿自动运行的任务.可是,对于大型的应用来讲,你几乎老是须要为数据库迁移(好比Rails中db:migrate任务)、清空缓存、或者代码维护等等编写脚本.对于每一项任务,你可能都须要写若干脚本,这会让你的管理变得复杂.那么,把它们用任务的方式整理到一块儿,会让管理变得轻松不少.工具

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

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

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

顺序执行

在Rake中定义任务后,能够指定任务的执行顺序,例如,天天早晨起床后的例行公事:
1. 关闭闹钟
2. 梳洗打扮
3. 泡杯咖啡
4. 遛狗
上面的几项事物,在Rakefile中这样描述

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
task :turn_off_alarm do
  puts "Turned off alarm. Would have liked 5 more minutes, though."
end
 
task :groom_myself do
  puts "Brushed teeth."
  puts "Showered."
  puts "Shaved."
end
 
task :make_coffee do
  cups = ENV [ "COFFEE_CUPS" ] || 2
  puts "Made #{cups} cups of coffee. Shakes are gone."
end
 
task :walk_dog do
  puts "Dog walked."
end
 
task :ready_for_the_day => [ :turn_off_alarm , :groom_myself , :make_coffee , :walk_dog ] do
  puts "Ready for the day!"
end


经过rake ready_for_the_day来执行任务,而后你就能够看到,全部的task都在按照你预约的顺序在执行。

?
1
2
3
4
5
6
7
Turned off alarm. Would have liked 5 more minutes, though.
Brushed teeth.
Showered.
Shaved.
Made 5 cups of coffee. Shakes are gone.
Dog walked.
Ready for the day!


此外还能够用过rake make_coffee COFFEE_CUPS=5这样在命令中给变量赋值。

命名空间

上面那样定义任务没有问题,但若是你须要另外定义些事物,好比工做相关的,交通相关的,这时候全部的任务混杂到一块儿显然就不合适了,毕竟上面那些任务只是咱们起床的例行事物,与其它无关。

经过namespace能够帮助咱们定义出Rails中相似rake db:migrate的任务,描画出事物间清晰的边界,将上面的任务包括在namespace的一个代码块中,以下

?
1
2
3
4
namespace :morning do
  task :turn_of_alarm
  ....
end


这一次咱们的调用命令就须要稍微作出些许变化,rake COFFEE_CUPS=3 morning:ready_for_the_day。 是否是跟rails中的rake任务调用方式很像呢?

默认Task

有了上面那些设置,若是咱们忘记或者不想写详细的任务名称,直接执行rake会有什么效果呢,结果是rake aborted!,任务被中断的报错。既然有这样的可能性,咱们就须要消除这些隐患,经过设置default默认任务就能够作到,以下:

?
1
task :default => 'morning:turn_off_alarm'


当你直接执行rake命令时,会执行默认操做,帮咱们关闭闹钟。

描述你的Task

当任务渐渐变多之后,管理问题就暴露出来了,除了命名空间之外,咱们还须要文档类的支持,帮助咱们梳理任务并显示的告诉咱们每一个任务的目的和功能,这时你能够试一试用desc描述任务。

?
1
2
3
4
5
6
7
...
desc "Make coffee"
task :make_coffee do
  cups = ENV [ "COFFEE_CUPS" ] || 2
  puts "Made #{cups} cups of coffee. Shakes are gone."
end
...


上面的描述不只能够在文档中查看,同时使用rake -T也能清洗的了解到每一个任务是作什么的。rake -T的输出结果是按照字母顺序排的序。

?
1
rake morning :make_coffee    # Make coffee


调取Task

Rake还容许在不一样任务之间互相调用,例以下面的代码,你想在下午也来杯咖啡,不用重复定义,直接使用上午的泡法,来一杯便可。

?
1
2
3
4
5
6
namespace :afternoon do
   task :make_coffee do
    Rake::Task[ 'morning:make_coffee' ].invoke
    puts "Ready for the rest of the day!"
   end
  end


Rake脚本编写

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
desc "任务1 -- 搭车去车车那里" #这听说是个苦差,由于太远了
task :busboy do
puts "发现挫男"
end
  
desc "任务2 -- 烤鱼"
task :bitchfish do
puts "老板,先烤九斤鱼"
end
  
desc "任务3 -- 网吧PC"
task :pc do
puts "我选中路"
end

 

打开命令行工具,进入这个文件所在目录,而后运行下面的命令,大体应该相似以下结果:

?
1
2
3
4
5
6
7
8
9
10
11
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)命令时输出在屏幕上.

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

 


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

?
1
puts "发现挫男"


彻底是一个普通的Ruby语句,puts是Ruby中进行输出的通常性方法,能够看出,Rake任务能够彻底使用Ruby的能力,这使得它很是强大.

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

接下来加入依赖关系:

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
desc "任务1 -- 搭车去车车那里"
task :busboy do
puts "发现挫男"
end
  
desc "任务2 -- 烤鱼"
task :bitchfish => :busboy do
puts "老板,先烤九斤鱼"
end
  
desc "任务3 -- 网吧PC"
task :pc do
puts "我选中路"
end

 

再次运行烤鱼任务,你会获得以下结果: 

?
1
2
3
4
D:\work>rake bitchfish
(in D:/work)
发现挫男
老板,先烤九斤鱼

加入命名空间:

跟任何编程语言相似,当你的rake文件不少时,当你有不少任务的时候,你须要关注它们的命名冲突问题,命名空间(namespace)就是一个天然的解决方案.你能够为上面的三个任务定义一个叫作dan的命名空间.

?
1
2
3
4
5
6
7
namespace :dan do
desc "任务1 -- 搭车去车车那里"
task :busboy do
puts "发现挫男"
end
……
end

 

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

?
1
2
3
4
5
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中使用多个命名空间,对任务进行分类.)

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

1.在一个任务中调用另一个任务

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

?
1
2
3
4
5
6
7
8
9
desc "今天的任务"
task :today do
Rake::Task[ "dan:bitchfish" ].invoke
Rake::Task[ "dan:pc" ].invoke
end
  
namespace :dan do
……
end

 

能够看出,调用其它任务的方式很简单,只须要调用

?
1
Rake::Task[ "task_name" ].invoke

方法就能够了.在命令行中启动rake today,能够获得:

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

2.默认任务:

能够为Rake增长一个默认任务,这样能够简单地用Rake命令来触发这个默认任务,在上面的rakefile中,咱们能够用以下方式把"today"任务做为默认任务.

?
1
task :default => [ :today ]


而后调用直接在命令行中调用rake,能够获得跟调用rake today一样的输出结果.

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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任务就算所有了解了...其它都是些代码枪花罢了..多耍即是..

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中定义任务后,能够指定任务的执行顺序,例如,天天早晨起床后的例行公事:
1. 关闭闹钟
2. 梳洗打扮
3. 泡杯咖啡
4. 遛狗
上面的几项事物,在Rakefile中这样描述

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
task :turn_off_alarm do
  puts "Turned off alarm. Would have liked 5 more minutes, though."
end
 
task :groom_myself do
  puts "Brushed teeth."
  puts "Showered."
  puts "Shaved."
end
 
task :make_coffee do
  cups = ENV [ "COFFEE_CUPS" ] || 2
  puts "Made #{cups} cups of coffee. Shakes are gone."
end
 
task :walk_dog do
  puts "Dog walked."
end
 
task :ready_for_the_day => [ :turn_off_alarm , :groom_myself , :make_coffee , :walk_dog ] do
  puts "Ready for the day!"
end


经过rake ready_for_the_day来执行任务,而后你就能够看到,全部的task都在按照你预约的顺序在执行。

?
1
2
3
4
5
6
7
Turned off alarm. Would have liked 5 more minutes, though.
Brushed teeth.
Showered.
Shaved.
Made 5 cups of coffee. Shakes are gone.
Dog walked.
Ready for the day!


此外还能够用过rake make_coffee COFFEE_CUPS=5这样在命令中给变量赋值。

命名空间

上面那样定义任务没有问题,但若是你须要另外定义些事物,好比工做相关的,交通相关的,这时候全部的任务混杂到一块儿显然就不合适了,毕竟上面那些任务只是咱们起床的例行事物,与其它无关。

经过namespace能够帮助咱们定义出Rails中相似rake db:migrate的任务,描画出事物间清晰的边界,将上面的任务包括在namespace的一个代码块中,以下

?
1
2
3
4
namespace :morning do
  task :turn_of_alarm
  ....
end


这一次咱们的调用命令就须要稍微作出些许变化,rake COFFEE_CUPS=3 morning:ready_for_the_day。 是否是跟rails中的rake任务调用方式很像呢?

默认Task

有了上面那些设置,若是咱们忘记或者不想写详细的任务名称,直接执行rake会有什么效果呢,结果是rake aborted!,任务被中断的报错。既然有这样的可能性,咱们就须要消除这些隐患,经过设置default默认任务就能够作到,以下:

?
1
task :default => 'morning:turn_off_alarm'


当你直接执行rake命令时,会执行默认操做,帮咱们关闭闹钟。

描述你的Task

当任务渐渐变多之后,管理问题就暴露出来了,除了命名空间之外,咱们还须要文档类的支持,帮助咱们梳理任务并显示的告诉咱们每一个任务的目的和功能,这时你能够试一试用desc描述任务。

?
1
2
3
4
5
6
7
...
desc "Make coffee"
task :make_coffee do
  cups = ENV [ "COFFEE_CUPS" ] || 2
  puts "Made #{cups} cups of coffee. Shakes are gone."
end
...


上面的描述不只能够在文档中查看,同时使用rake -T也能清洗的了解到每一个任务是作什么的。rake -T的输出结果是按照字母顺序排的序。

?
1
rake morning :make_coffee    # Make coffee


调取Task

Rake还容许在不一样任务之间互相调用,例以下面的代码,你想在下午也来杯咖啡,不用重复定义,直接使用上午的泡法,来一杯便可。

?
1
2
3
4
5
6
namespace :afternoon do
   task :make_coffee do
    Rake::Task[ 'morning:make_coffee' ].invoke
    puts "Ready for the rest of the day!"
   end
  end


Rake脚本编写

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

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

?
1
2
3
4
5
6
7
8