Я пытаюсь понять, как работают зависимости в 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.