JT's Blog

Do the right things and do the things right.

Rake - Ruby Make

| Comments

說明

Rake is a Make-like program implemented in Ruby.

Tasks and dependencies are specified in standard Ruby syntax.

Install

1
$ gem install rake

使用 -T 查詢所有rake 指令

1
$ rake -T

Rakefile

寫 rake 很簡單,把執行的動作都寫在 Rakefile,格式如下:

1
2
3
4
5
6
# Rakefile

desc "描述此 rake"
task :task_name do
  # 要執行的動作
end

撰寫自用腳本

  1. 如果單純輸入 rake,就執行 default 指定的 task
1
2
3
4
5
6
7
# Rakefile
task default: %w[test]

desc "Run Unit Test"
task :test do
  ruby "test/unittest.rb"
end

2.加入 namespace

1
2
3
4
5
6
7
8
9
10
11
# Rakefile
namespace :dev do
  desc "demo"
  task :demo do
    2.times do
      puts "create users"
    end
  end
end

$ rake dev:demo

開發指令

  • system 執行linux 指令或git 指令
  • raise 產生錯誤,終止task
  • 自己寫 method 處理使用者輸入字串
  • 套用 ruby gem
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Rakefile
desc "Create Folder"
task :create_folder, :folder_name do |t, args|
  if args.folder_name
    folder_name = args.folder_name
  else
    folder_name = get_stdin("Enter a name for your folder: ")
  end

  # raise 產生錯誤,終止 task
  raise "There does not input any folder name" unless folder_name

  # 使用 system 執行 linux 指令
  system "cd ~"

  # ruby FileUtils#mkdir
  mkdir "#{folder_name}"

  puts "created a folder #{folder_name}"
end

def get_stdin(message)
  print message
  STDIN.gets.chomp
end

平行處理

使用 multitask 執行 tasks

1
2
3
4
desc "rename pictures"
multitask :rename_picture do
 # doing rename task
end

一次執行多個 tasks

將要執行的 task 放入 array

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
desc "drop database"
task :drop_db do
  # drop database
end

desc "create database"
task :create_db do
  # create database
end

desc "migrate database"
task :migrate_db do
  # migrate database
end

desc "reset database"
task :reset_db => [:drop_db, :create_db, :migrate_db] do
end

Rake in Rails

查看 Rails Rakefile

1
2
3
4
5
6
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.

require File.expand_path('../config/application', __FILE__)

Rails.application.load_tasks

在 rails 中,已經規範自訂的 tasks 要寫在 lib/tasks 目錄底下,並命名為 **.rake

注意

在rails 中,如果有使用到 ActiveRecord,需要加上 :environment

1
2
3
4
desc "Count available User"
task :count_available_user :environment do
  puts User.available_count
end

Rake 應用

  • 大量修改資料
  • 刪除 db connections
  • 測試簡訊功能
  • 建立資料 (同 Seeds)
  • 測試 apn
  • 匯出、匯入資料

Rails 5

Rails 5 之後,原本 rake 指令,也都搬一份到 rails 指令底下

1
2
3
4
5
$ rake db:migrate

# equivalent to

$ rails db:migrate

Reference

Comments