Tìm hiểu về Rake
Bài đăng này đã không được cập nhật trong 9 năm
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.
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)
All rights reserved