分享 Rake 简介与编写

liukai · 2015年10月27日 · 最后由 panxiubin 回复于 2016年11月28日 · 7739 次阅读

rake 简介

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

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

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

rake 的编写

首先 rake 文件的后缀是.rake,存放在 lib/tasks 文件夹下。 可以通过 rake --tasks 来查看当前程序下所已存在的 rake 脚本。 看下面这个例子:

desc "study rake about rails"    #desc 是Rake定义的方法,表示对下面定义任务的描述.这个描述会在使用Rake --tasks(或者Rake -T)命令时输出在屏幕上.
task :study_rake do         #cmd 命令行中执行 rake study_rake 开始执行脚本,task是Rake最重要的方法.它的方法定义是:task(args, &block).任务体是一个block。
  %w(a b c).each do |d|
    puts d   #编写你所需的功能代码。
  end 
end

这就是创建了一个 rake 脚本,这个脚本的作用是循环遍历 ["a", "b", "c"] 这个数组。

依赖关系和命名空间

依赖关系

desc "rake1"   
task :rake1 do   
    puts "rake1"   
end   

desc "rake2"   
task ::rake2=> :rake1 do   
    puts "rake2"   
end  

输出结果:

rake1
rake2

命名空间

namespace :today do
desc "rake1"   
task :rake1 do   
    puts "rake1"   
end      
end

那执行命令就是:rake today:rake1

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

desc "today rake"   
task :today do   
  Rake::Task["rakes:rake1"].invoke
  Rake::Task["rakes:rake2"].invoke
  Rake::Task["rakes:rake3"].invoke
end  
namespace :rakes do
desc "rake1"   
task :rake1 do   
    puts "rake1"   
end  
desc "rake2"   
task :rake2 do   
    puts "rake2"   
end  
desc "rake3"   
task :rake3 do   
    puts "rake3"   
end  
end

默认任务

task :default => [:today]  

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 任务已经为你整装待发了.

E. 参考资料 http://blog.sina.com.cn/s/blog_4748c4d20100y9iu.html

请问一下,比如我增加了一个 lib/tasks/jd.rake 任务,在这个 jd.rake 任务,我定义了 task1 和 task2,运行成功后。发现这些逻辑可以用,然后我想把这里的 rake 任务写到 MVC 里,应该怎么操作呢? 在 rake 里写的任务和在 mvc 里写的有哪些区别呢?

#1 楼 @panxiubin 你可以把 task1, task2 中共用的逻辑打包成一个 service, 比如叫 FooService,

class FooService

  def call
    ...
  end

end

@kayakjiang 好的,非常感谢。我试试去。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号