Rake定义
Ruby中的任务执行器。Rails应用中用的比较多,如:rake db:migrate,rake routes。不过,从Rails 5.0开始,可以用rails替代rake,如:rails db:migrate。
注意Rake与Rack的区别,Rake是任务管理器,Rack是Ruby服务器与web框架的整合器。
如何定义Rake任务
desc "Print reminder about eating more fruit."
task: apple do
puts "Eat more apples !"
end
上述代码可以放到Rakefile文件里。如果在Rails应用里,可以把上述代码放到/lib/tasks/apple.rake。
通过执行rake apple运行定义的:apple任务。在Rake任务的代码块里,可以书写Ruby代码。同时,Rake中引入了FileUtils模块,可以使用里面定义的函数:
- cp:拷贝文件
- mkdir_p:创建文件夹
- chown:修改文件权限
- rm_r:递归删除
Rake本身也定义了函数,供我们使用:
-
ruby:执行Ruby文件
-
sh:执行系统命令
-
safe_in:在文件系统里创建软link
task :clean_cache do rm_r FileList("tmp/cache/*") end
使用rm_r命令的时候要小心,这个命令执行并不会询问,会直接删除。
在特定文件夹里运行Rake命令
task :import do
puts "Importing data..."
Dir.chdir(Rails.root.join("data")) { ruby "load-data.rb" }
end
上述任务在data文件夹里执行load-data.rb文件。Dir.chdir命令用来切换文件夹,切换后,执行代码块里的代码。
Rake中使用Namespace
定义Rake任务时很容易使用相同的名字,造成冲突,可以通过Namespace来避免同名的任务冲突。
namespace :backup do
task :create do
# ...
end
task :list do
# ...
end
task :restore do
# ...
end
end
通过rake back:create执行上述任务。
任务间依赖
下面例子中,任务load_database会在任务create_example之前执行。
task create_example: "load_database" do
#...
end
依赖的任务也可以放在数组中,任务名称可以是字符串,也可以是symbol。
任务中运行任务
task :coverage do
ENV['COVERAGE'] = 'true'
Rake::Task["test"].execute
end
上述代码中,通过Rake::Task在任务中执行任务。通过ENV设置环境变量。
Rake命令选项
- rake -T:列出所有的任务
- rake -P:列出任务和它们的依赖
- rake -W:列出任务和它们定义的位置
- rake -V:verbose模式
- rake -t:debug模式
- rake -f:使用具体的Rakefile