除了Rake任务本身的标准执行方式外,其实在编写Rakefile时还有一些小技巧能够用来改善Rake的常规执行,从而优化你的工作流。
不同的Rake任务之间可以互相调用,即使它们在不同的namespace
中。如下,执行rake db:db:environment
时会同时触发执行db:environment
和environment
两个任务。
namespace :db do
task :environment => :environment do
puts "db:environment"
end
task :migrate => :environment do
puts "db:migrate"
end
end
task :environment do
puts "environment"
end
对于那些只在后台跑的Rake任务,因为没有显示信息,所以调试起来总是特别的费劲儿。这时你可以试一试下面这招,执行raek verbose deploy
LOGGER = Logger.new
task :verbose do
LOGGER.level = Logger::DEBUG
end
task :deploy do
LOGGER.debug(:environment){ENV}
# ...
end
借助实例变量,实现管道流的功能:
mespace :dump do
task :users do
@records = Users.all
end
task :posts do
@records = Posts.all
end
task :updated_recently do
@records = @records.where("updated_at > ?", 6.months.ago)
end
task :as_json do
$stdout.write(@records.as_json)
end
task :as_xml do
$stdout.write(@records.as_xml)
end
end
Rake任务允许定义多个同名任务。如下,执行rake deploy
会同时触发两个deploy
任务,通过这种方式可以将一个大任务切分成多个子任务重新组织和简化.rake
文件。
task :deploy do
puts "Deploy 1"
end
task :deploy do
puts "Deploy 2"
end
我们Rake任务很多时候会跟循环打交道,这些循环里有些是只读,有些会写入。但无论哪种类型,在循环迭代的时候有个状态输出,总会比死寂一般的hold在那要好很多。
task :output do
%(1..100).each do |x|
#...
print '.'
end
end
-完-