Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

เชี่ยวชาญ Rake ใน Ruby: คู่มือสมบูรณ์สู่การทำงานอัตโนมัติ

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 คือ เมื่อไฟล์ถูกบีบอัดแล้ว มันจะไม่ถูกบีบอัดซ้ำ จนกว่าไฟล์ต้นทางจะเปลี่ยน

สังเกตบางอย่างในโค้ดนี้:

  1. เราใช้คลาส FileList ซึ่งเป็นส่วนหนึ่งของ Rake เพื่อกำหนดรายการไฟล์ที่เราต้องการทำงาน
  2. Rule เริ่มต้นด้วยนามสกุลเป้าหมาย (TARGET extension) เพื่อให้ rule match เราต้องใช้ .ext(".txt.gz") บน FileList
  3. .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 ต่างกัน

เชี่ยวชาญ Rake ใน Ruby: คู่มือสมบูรณ์สู่การทำงานอัตโนมัติ

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

ขอบคุณที่อ่านครับ!