مهمة أشعل النار مع متطلبات متعددة توليد مخرجات متعددة

StackOverflow https://stackoverflow.com//questions/24026092

  •  21-12-2019
  •  | 
  •  

سؤال

لدي طريقة تعتمد على ملفين للإدخال ، والتي تنتج ملفين أو أكثر كإخراج.لا يوجد تعيين واحد لواحد بين كل ملف إدخال وكل ملف إخراج-تقوم الطريقة بتنفيذ العمليات التي تجمع بين بيانات الإدخال لإنتاج ملفات إخراج مختلفة.

إليك مثال (مفتعل إلى حد ما) :

class Util
  def self.perform
    `cat source1.txt source2.txt > target1.txt`
    `cat source2.txt source1.txt > target2.txt`
  end
end

تحرير: الكود الفعلي في حالتي أكثر تعقيدا من هذا ، وليس من الممكن فصل العمل المنجز لإنتاج كل ملف مستهدف إلى أجزاء مميزة.ومن ثم إعداد واحد مهمة الملف لكل ملف الهدف ليس حقا خيارا في حالتي.

كيف أقوم بإعداد مهمة أشعل النار لتشغيل هذه الطريقة مرة واحدة عند الحاجة وبعد ذلك فقط ، أي.إذا كان واحد أو أكثر من الملفات الهدف مفقودة, أو إذا كان أي من الملفات المصدر هي أحدث من أي من الملفات الهدف?

يبدو حلي الحالي كما يلي:

task :my_task => ['source1.txt', 'source2.txt'] do |t|
  targets = ['target1.txt', 'target2.txt']
  if targets.all? { |f| File.exist? f }
    mtime_newest_source = t.prerequisites.map {|f| File.mtime(f) }.max
    mtime_oldest_target = targets.map {|f| File.mtime(f) }.min
    # Stop task early if all targets are up to date
    next if mtime_newest_source < mtime_oldest_target
  end
  # Code that actually produces target files goes here
end

ما أبحث عنه هو وسيلة لتحديد المهمة بحيث لا شيء من التعليمات البرمجية سيتم تشغيل داخل الكتلة الخاصة به ما لم تكن الملفات المستهدفة بحاجة إلى إعادة بنائها.

هل كانت مفيدة؟

المحلول

filetasks تم تصميمها لهذا بالضبط.إليك تفسير طويل قديم جيد ، وهنا مثال سريع:

giveacodicetagpre.

قد تعتمد مهام الملفات على مهام أو ملفات أشعل النار الأخرى على القرص.إذا كانت مهامك تعتمد على ملف، فسيقوم أشعل النار بمقارنة الطوابع الزمنية وتشغيل مهمتك فقط إذا كان الملف المعتمد أحدث.

تحديث

إليك مثال عمل لتوليد جميع الأهداف من كلا المهام.أشعل النار ذكي بما يكفي لتخطي المهمة الثانية عندما يقوم الأول بإنشاء كل من الملفات.

giveacodicetagpre.

نصائح أخرى

لا أعتقد أن الإجابات المذكورة أعلاه صحيحة.التعليق من لارس

['target1.txt', 'target2.txt'].each { |target| file target => ['source1.txt', 'source2.txt'] { do_stuff_here } }

سيتم تشغيل { do stuff here } مرتين إذا أشعل النار 'target1.txt', 'target2.txt' يسمى.

أعتقد أن الحل الصحيح للتبعيات يتحقق من خلال

file 'target1.txt' => ['source1.txt', 'source2.txt'] { do_stuff_here } file 'target2.txt' => 'target1.txt'

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top