Rake เป็น task runner ยอดนิยมใน Ruby
Task (งาน) คืออะไร?
- การสำรองข้อมูลฐานข้อมูล (backup database)
- การรันเทสต์ (running tests)
- การรวบรวมและรายงานสถิติ
นี่คืองานเล็กๆ ที่ถ้าไม่มี Rake จะกระจายอยู่ทั่วโปรเจกต์บนไฟล์ต่างๆ
Rake รวมการเข้าถึงงานของคุณไว้ที่เดียว
Rake ยังทำให้บางอย่างง่ายขึ้น เช่น การหาไฟล์ที่ตรงกับรูปแบบหนึ่ง และถูกแก้ไขล่าสุด
อีกอย่างหนึ่ง:
อย่าสับสน Rake กับ Rack ชื่อคล้ายกันมาก แตต่างกันสิ้นเชิง
- Rake คือ task runner
- Rack ช่วยให้เซิร์ฟเวอร์และเฟรมเวิร์ก Ruby ทำงานร่วมกันได้
ตอนนี้:
มาเจาะลึก Rake กัน!
ใครใช้ Rake?
Rails!
ถ้าคุณเคยทำอะไรกับ Rails มักคุ้นเคยกับคำสั่ง rake db:migrate
หรือ rake routes
นั่นคือ Rake ในการทำงานอยู่แล้ว
สังเกตว่า Rails ตั้งแต่เวอร์ชัน 5.0 อนุญาตให้คุณเรียกคำสั่ง rake ส่วนใหญ่ด้วย rails แทน
กล่าวอีกนัยหนึ่ง:
คุณทำ rails db:migrate ได้ แต Rake ยังคงทำงานอยู่
วิธีเขียน Rake Task
นี่คือ Rake task เรียบง่าย:
desc "Print reminder about eating more fruit." task :apple do puts "Eat more apples!" end
คุณสามารถวางโค้ดนี้ในไฟล์ชื่อ Rakefile หรือถ้าคุณใช้ Rails บันทึกไว้ที่ lib/tasks/apple.rake
เพื่อรัน task นี้:
rake apple # "Eat more apples!"
ภายใน task คุณเขียนโค้ด Ruby ธรรมดาได้ แตมีเมธอด Rake ที่ช่วยเหลือบางอย่าง
ตัวอย่าง:
- ruby (รันไฟล์ Ruby)
- sh (รันคำสั่งระบบ)
- safe_ln (สร้าง symbolic link ในระบบไฟล์)
Rake รวมโมดูล FileUtils ไว้
หมายความว่าคุณสามารถคัดลอกไฟล์ด้วย cp สร้างไดเรกทอรี่ด้วย mkdir_p และเปลี่ยนสิทธิ์ไฟล์ด้วย chown ได้
ตัวอย่าง:
task :clean_cache do rm_r FileList["tmp/cache/*"] end
ระวังกับ rm_r (remove with recursion) เพราะมันจะลบไฟล์โดยไม่ยืนยัน หากคุณต้องการเพิ่มขั้นตอนยืนยัน คุณสามารถเพิ่ม dependent task (ครอบคลุมในภายหลัง) และ raise exception หากไม่อยากดำเนินต่อ
การรันคำสั่ง Rake ภายในไดเรกทอรี่อื่น
คุณอาจต้องการรันคำสั่ง Rake ภายในไดเรกทอรี่เฉพาะ
วิธีทำ:
task :import do
puts "Importing data..."
Dir.chdir(Rails.root.join("data")) { ruby "load-data.rb" }
end
ในตัวอย่างนี้ ผมรันสคริปต์ Ruby ภายในโฟลเดอร์ data ในโปรเจกต์ Rails ของผม
วิธีใช้ Namespaces ใน Rake
เพราะ task อาจมีชื่อคล้ายกัน ง่ายที่จะใช้ชื่อซ้ำ
นั่นคือเหตุผลที่ Rake มี namespaces
ตัวอย่าง:
คุณสามารถสร้าง namespace backup สำหรับงาน backup ทั้งหมด
เช่นนี้:
namespace :backup do
task :create do
# ...
end
task :list do
# ...
end
task :restore do
# ...
end
end
เพื่อรัน namespaced task:
rake backup:create
Dependent Tasks (งานที่ขึ้นกัน)
Rake อนุญาตให้คุณกำหนดรายการ task อื่นๆ ที่ต้องรันก่อน task ปัจจุบัน
ด้วยสิ่งนี้ คุณสามารถทำ setup ใดๆ ที่ task ต้องการได้
ตัวอย่าง:
task create_examples: "load_database" do # ... end
ในตัวอย่างนี้ load_database จะรันก่อน create_examples
รายการ dependent tasks สามารถเป็นอาร์เรย์ของสตริงหรืออาร์เรย์ของสัญลักษณ์ (symbols) ได้
รัน Rake Task ภายใน Task อื่น
ถ้าแทนที่จะมีชุด task ที่รัน ก่อน task ปัจจุบัน คุณต้องการรัน task อื่น ภายใน task ปัจจุบัน คุณสามารถใช้โค้ดต่อไปนี้
ตัวอย่าง:
task :coverage do ENV['COVERAGE'] = 'true' Rake::Task["test"].execute end
สิ่งนี้ช่วยตั้งค่าตัวแปรสภาพแวดล้อมที่เปิดใช้งาน test coverage และตัวเลือกอื่นๆ
วิธีใช้ Rake Rules
Rules กำหนดการแปลงนามสกุลไฟล์ (file extension transformations)
ตัวอย่าง:
task compress: FileList["/tmp/*.txt"].ext(".txt.gz")
rule '.txt.gz' => '.txt' do |t|
sh "gzip", "-k", "-f", t.source
end
ประโยชน์ของการใช้ rules คือ เมื่อไฟล์ถูกบีบอัดแล้ว มันจะไม่ถูกบีบอัดซ้ำ จนกว่าไฟล์ต้นทางจะเปลี่ยน
สังเกตบางอย่างในโค้ดนี้:
- เราใช้คลาส
FileListซึ่งเป็นส่วนหนึ่งของ Rake เพื่อกำหนดรายการไฟล์ที่เราต้องการทำงาน - Rule เริ่มต้นด้วยนามสกุลเป้าหมาย (TARGET extension) เพื่อให้ rule match เราต้องใช้
.ext(".txt.gz")บนFileList .txt.gz => .txtนี้ไม่ได้หมายถึงเราไปจากtxt.gzไปtxtมันคือทางตรงข้าม พยาน (arrow) คือไวยากรณ์ hash
ตัวเลือกและคำสั่ง Rake
นี่คือรายการตัวเลือก Rake ที่มีประโยชน์:
- rake -T (แสดง task ที่มีอยู่)
- rake -P (แสดง task และ dependencies)
- rake -W (แสดง task และตำแหน่งที่กำหนด)
- rake -V (verbose mode, echo คำสั่งระบบ)
- rake -t (debugging mode)
- rake -f (ใช้ Rakefile เฉพาะ)
ตัวอย่าง ในแอป Rails:
> rake -T test rake test # Runs all tests in test folder except system ones rake test:db # Run tests quickly, but also reset db rake test:system # Run system tests only
สรุป
คุณได้เรียนรู้เกี่ยวกับ Rake task runner ยอดนิยมสำหรับ Ruby
ใช้ rake -T เพื่อหาว่ามี task อะไรบ้าง สร้าง task ของตัวเอง และเพิ่มลงใน Rakefile หรือภายในโฟลเดอร์ lib/tasks และจำไว้ว่า Rake และ Rack ต่างกัน

อย่าลืมแชร์บทความนี้เพื่อให้คนอื่นเพลิดเพลินไปกับมัน 🙂
ขอบคุณที่อ่านครับ!