Rake-зависимое поведение - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь понять, как работают зависимости в Rake.

Чтобы показать вам, что я не понимаю, я подготовил небольшой пример Rakefile с именем test.rake, для которого требуется одна папка с текстовыми файлами, которые я созданный с использованием:

mkdir test && for i in {1..10}; do echo ${i}_testrake.fz > test/${i}.txt; done

Затем вы получите следующую структуру:

test/
|_ 1.txt
|_ 2.txt
|_ 3.txt
|_ 4.txt
|_ 5.txt
|_ 6.txt
|_ 7.txt
|_ 8.txt
|_ 9.txt
|_ 10.txt

Сценарий вызывается с помощью rake -f test.rake filedir=test/ -j 2 --trace и дважды изменяет исходный текст, с ${i}_testrake.fz до ${i}_testrake до ${i}_rake. Он спит 10 секунд на каждом шаге, так что у нас есть время посмотреть, что происходит с рейком.

А вот и Rakefile:

#!/usr/bin/env rake

#Command-line argument
ENV["filedir"] ? @filedir = ENV["filedir"] : nil

#Constants
TEXT = FileList["#{@filedir}/*.txt"]
TEXT_MODIFIED1 = TEXT.pathmap("test_results/%n_1.txt")
TEXT_MODIFIED2 = TEXT.pathmap("test_results/%n_2.txt")

#Tasks
directory "test_results"

TEXT_MODIFIED1.zip(TEXT).each do |text1, text|
    file "#{text1}" => ["test_results", "#{text}"] do
        sh "sleep 10 && sed 's/.fz//g' #{text} > #{text1}"
    end
end

desc "modif 1"
multitask :modif1 => TEXT_MODIFIED1 do
    puts "modif1 done"
end

TEXT_MODIFIED2.zip(TEXT_MODIFIED1).each do |text2, text1|
        file "#{text2}" => ["test_results", "#{text1}"] do
                sh "sleep 10 && sed 's/test//g' #{text1} > #{text2}"
        end
end

desc "modif 2"
multitask :modif2 => TEXT_MODIFIED2 do
        puts "modif2 done"
end

desc "default"
task :default => :modif2

В этой форме скрипт запускается как ожидается; Это означает, что если я запускаю его с флагом -j 2, будут обрабатываться 2 образца одновременно +, если файлы уже присутствуют, сценарий больше не будет выполнять задачи.

Теперь, если я изменю:

  • Строка file "#{text2}" => ["test_results", "#{text1}"] до file "#{text2}" => ["test_results", :modif1] ==> скрипт всегда будет выполнять все задачи, начиная с начала.
  • Строка file "#{text2}" => ["test_results", "#{text1}"] do до file "#{text2}" => ["test_results", TEXT_MODIFIED1].flatten do ==> будет не выполнять задачи снова, если файлы найдены; но если я удаляю каталог результатов и снова запускаю сценарий, то вместо двух будет обрабатываться только один текстовый файл за раз.

Я понимаю, что способ записи в rake может быть немного неортодоксальным, но это лучшее, что я могу сделать сейчас как пользователь-самоучка. В основном я использую его для соединения программного обеспечения и сценариев, и думаю, что это хороший инструмент, особенно для этого. Однако жаль, что он выполняет все задачи с самого начала, когда я хотел добавить лишь небольшой шаг в свой анализ, особенно когда анализ занимает некоторое время.

Любая помощь в понимании того, почему это было бы здорово!

Я использую Rake версии 12.3.1 и Ruby 2.0.0.

...