Tìm hiểu về Rake

1. What is Rake?

  • Là một công cụ quản lý các task của một project.
  • Có khả năng build các project.
  • Các phần mềm tương tự như Apache Ant, Maven, Make.
  • Được viết bằng Ruby.
  • Rake được mô tả trong Rakefiles (equivalent of Makefiles in Make), Rakefile sử dụng cú pháp của Ruby.
  • Dev định nghĩa các tasks trong file Rakefile;
  • Từ version Ruby 1.9, Rake trở thành một phần trong thư viện chuẩn của Ruby.
  • Rake Format http://ruby-doc.org/core-1.9.3/doc/rake/rakefile_rdoc.html
  • Túm lại Rake giống như thằng Host nhận nhiệm vụ từ Dev và gọi các thằng khác thực hiện nhiệm vụ.

Ví dụ :

  • Tạo 1 folder.
  • Tạo Rakefile file trong folder vừa tạo .
  • Nội dung của Rakefile:
task default: [:test]

task :test do
  hello
end

def hello
  p "Hello world!!!"
end

Let get started!

$ rake
$ Hello world!!!

2. Difference Between Rake and Other Build Tools

  • Có một sự khác biệt nhẹ giữa Rake với các công cụ build app khác, đó là, thay vì phải viết Makefile cho make, build.xml cho ant hay pom.xml cho mvn (Apache Maven) bạn chỉ cần viết code Ruby để định nghĩa các task trong file Rakefile. Có thể hiểu khi viết Rakefile ta sẽ sử dụng cú pháp ruby.

  • http://hyperpolyglot.org/build

3. Install Rake

gem install rake


$ which rake
$ /home/leminhtuan/.rvm/gems/ruby-2.1.5/bin/rake

###4. Simple Example Tạo Rakefile


task default: [:test]

task :test do
  p "hello world !!!"
end

Run


$ rake
$ hello world !!!

###5. Rakefile Format

  • Tasks: (task) là thành phần chính trong rake, định nghĩa một công việc (giống như một method trong code), trong một Rakefile có thể bao gầm nhiều task.

- File Tasks: (file) là một task dùng để tạo file.
- Directory Tasks: (directory) đôi khi chúng ta cần taoh một thư mục lúc đó ta sẽ sử dụng directory task. `(task "directory" trong rake cũng giống như command "mkdir" của shell unix) vì thế ta có thể định nghĩa ra một task sau đó gọi lệnh "mkdir" hay cũng có thể sử dụng trực tiếp task "directory".`
- Task Arguments: Ta có thể chuyền tham số vào task

task :hello, [:first_name, :last_name] do |t, args|
  puts "First name is #{args.first_name}"
  puts "Last  name is #{args.last_name}"
end


$ rake "hello[Tuấn, Tâm]"
$ First name is Tuấn
$ Last  name is Tâm


- Namespaces: Khi project ngày càng lớn trong đó có những task có thể trùng tên do tương tự về chức năng vì thế ta phải sử dụng namespace để phân biệt.

namespace "main" do
  task :build do

# Build the main program

  end
end
namespace "samples" do
  task :build do

# Build the sample programs

  end
end
task build: %w[main:build samples:build]

  • The Default Task: Khi muốn chạy một task trong Rakefile ta luôn phải chỉ rõ task nào muốn chạy:

# task default: [:test]

task :test do
  hello
end
def hello
  p "Hello haha"
end
task :name,  [:first_name,  :last_name] do |t,  args|
  puts "First name is #{args.first_name}"
  puts "Last  name is #{args.last_name}"
end

Chạy task co tên là "test" trong Rakefile.


$  rake test

Nếu đã định nghĩa task default: [:name] thì ta chỉ cần chạy rake mà không cần chỉ rõ ra task khi chạy racke.

  • Invoking Tasks: Cũng giống như việc khi ở bên trong Phương thức M1 ta muốn gọi phương thức M2, thì đối với Rake ta có thể gọi một task T2 khi đang ở task T1.
  • Rake::Task["test"].invoke

task default: [:name]

task :test do
  hello
end

def hello
  p "Hello haha"
end

task :name,  [:first_name,  :last_name] do |t,  args|
  Rake::Task["test"].invoke
  puts "First name is #{args.first_name}"
  puts "Last  name is #{args.last_name}"
end


$ rake "name[1, 2]"
$ "Hello haha"
$ First name is 1
$ Last  name is 2

###6. Rake + Rails

Rails đã định nghĩa ra các task mà bất kì ai đã dùng rails đều đã sử dụng qua: ví dụ:

  • Task migrate trong namespace db (rake db:migrate)
  • Task seed trong namespace db (rake db:seed)
  • Task routes (rake routes)
  • Task precompile trong name space assets (rake assets:precompile)

Rails tự động load tất cả các file có đuôi .rake trong thư mục lib/tasks và coi chúng là các task của một Rails project (vì thế ta hoàn toàn có thể tạo ra những task của riêng mình).

###7. Create a rake task in Rails.

  • rails g task sẽ dùng để tạo ra task trong Rails.

$ rails g task my_namespace my_task1 my_task2
$ create lib/tasks/my_namespace.rake

  • Rails sẽ store các task vừa tạo trong thư mục lib/tasks/. lúc này ta sẽ có một file .rake là lib/tasks/my_namespace.rake

namespace :my_namespace do
  desc "TODO"
    task :my_task1 => :environment do
  end

  desc "TODO"
    task :my_task2 => :environment do
  end
end

  • Và bây giờ ta có thể viết một task bằng việc viết code trong phần do ... end

(thankyou)