[ruby] Rakefile

166 阅读2分钟

Rake定义

Ruby中的任务执行器。Rails应用中用的比较多,如:rake db:migraterake 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模块,可以使用里面定义的函数:

  1. cp:拷贝文件
  2. mkdir_p:创建文件夹
  3. chown:修改文件权限
  4. rm_r:递归删除

Rake本身也定义了函数,供我们使用:

  1. ruby:执行Ruby文件

  2. sh:执行系统命令

  3. 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命令选项

  1. rake -T:列出所有的任务
  2. rake -P:列出任务和它们的依赖
  3. rake -W:列出任务和它们定义的位置
  4. rake -V:verbose模式
  5. rake -t:debug模式
  6. rake -f:使用具体的Rakefile

References

What is Rake in Ruby and how to use it?