การเรียกใช้ Rake Tasks ภายในสคริปต์ Ruby

ถ้าคุณเคยทำงานกับ Ruby และ Rake คุณก็จะรู้ว่า Rake เป็นเครื่องมือที่มีคุณค่าสำหรับการทำงานอัตโนมัติต่าง ๆ ในโปรเจกต์ของคุณ อย่างไรก็ตาม คุณอาจสงสัยว่า: ฉันจะเรียกใช้ Rake tasks โดยตรงจากสคริปต์ Ruby ได้อย่างไร? โดยปกติแล้ว คุณจะเรียกใช้ Rake task โดยใช้บรรทัดคำสั่ง แต่ถ้าคุณต้องการเรียกใช้เหล่านี้จากภายในโค้ด Ruby ของคุณล่ะ?

ในโพสต์นี้ เราจะสำรวจวิธีการที่สะอาดและมีประสิทธิภาพเพื่อให้บรรลุเป้าหมายนี้ ช่วยให้คุณสามารถปรับปรุงกระบวนการทำงานในการพัฒนาของคุณได้

เข้าใจปัญหา

คุณอาจมี Rakefile ที่มี task ตัวอย่างเช่น:

rake blog:post Title

ตอนนี้ ลองนึกภาพว่าคุณต้องการเรียกใช้ Rake task นั้นหลายครั้งโดยไม่ต้องใช้บรรทัดคำสั่งหรือทำการ shelling โดยใช้ backticks หรือวิธี system สถานการณ์ทั่วไปนี้นำไปสู่ความต้องการในการแก้ปัญหาอย่างมีน้ำใจ มาดูวิธีการที่คุณสามารถทำอย่างนี้ได้อย่างตรงไปตรงมา

วิธีการทีละขั้นตอน

1. ต้องการไลบรารี Rake

แรกสุด คุณต้องรวมไลบรารี Rake ไว้ในสคริปต์ Ruby ของคุณ สิ่งนี้จะช่วยให้คุณเข้าถึงฟังก์ชันทั้งหมดที่ Rake มีให้

require 'rake'

2. ตั้งค่าการจับภาพผลลัพธ์

เมื่อเรียกใช้ Rake tasks มักจะช่วยให้สามารถจับผลลัพธ์สำหรับการบันทึกหรือวิเคราะห์ข้อผิดพลาด วิธีการต่อไปนี้ช่วยให้คุณจับทุกสิ่งที่พิมพ์ไปยังเอาต์พุตมาตรฐานในขณะที่ Rake task กำลังทำงาน:

def capture_stdout
  s = StringIO.new
  oldstdout = $stdout
  $stdout = s
  yield
  s.string
ensure
  $stdout = oldstdout
end

3. โหลด Rake Tasks ของคุณ

คุณต้องโหลด Rake task ที่เฉพาะเจาะจงที่คุณต้องการเรียกใช้ สมมติว่าคุณมีไฟล์ task ที่ชื่อว่า metric_fetcher อยู่ในไดเรกทอรี lib/tasks นี่คือวิธีที่คุณสามารถเรียกใช้มัน:

Rake.application.rake_require 'metric_fetcher', ['../../lib/tasks']

4. เรียกใช้ Rake Task

ถัดไป คุณจะต้องการเรียกใช้ Rake task นั้นจริง ๆ คุณสามารถทำเช่นนี้ภายใน block capture_stdout เพื่อจับเอาต์พุต:

results = capture_stdout { Rake.application['metric_fetcher'].invoke }

ตัวอย่างทั้งหมด

รวมทุกอย่างเข้าด้วยกัน นี่คือสคริปต์ Ruby ที่สมบูรณ์ที่คุณสามารถใช้เพื่อเรียกใช้ Rake task:

require 'rake'
require 'stringio'

def capture_stdout
  s = StringIO.new
  oldstdout = $stdout
  $stdout = s
  yield
  s.string
ensure
  $stdout = oldstdout
end

Rake.application.rake_require 'metric_fetcher', ['../../lib/tasks']
results = capture_stdout { Rake.application['metric_fetcher'].invoke }
puts results

ความคิดสุดท้าย

การเรียกใช้ Rake tasks จากสคริปต์ Ruby สามารถช่วยปรับปรุงวิธีการที่คุณจัดระเบียบและทำงานอัตโนมัติในกระบวนการพัฒนาของคุณได้มาก ด้วยการปฏิบัติตามขั้นตอนที่อธิบายไว้ข้างต้น คุณสามารถรวม Rake เข้ากับแอปพลิเคชัน Ruby ของคุณได้อย่างมีระเบียบ ส่งเสริมกระบวนการพัฒนาที่มีประสิทธิภาพมากขึ้น

ลองทำดูและดูว่าวิธีนี้จะสามารถช่วยประโยชน์ในโปรเจกต์ของคุณได้อย่างไร!