Как вы общаетесь между задачами Rake?

Скажем, у меня есть цель, которая должна скомпилировать некоторые файлы. У этой цели есть еще одна цель в качестве предпосылки, которая получает файлы. Скажем так:

task :obtain do
  # obtain files from somewhere
end

task :compile => :obtain do
  # do compilation
end

Скажем, что цель :obtain не всегда помещает файлы в одну и ту же папку. Как передать :compile путь, найденный :obtain? Переменные среды?

Ответы

Ответ 1

Использование ENV ['something'] на мой взгляд предпочтительнее, потому что если вы сделаете это так (в отличие от переменных $global или @instance), вы можете рассматривать их как аргументы задачи и легко использовать подзадачу из командной строки.

С другой стороны, если вы сохраняете свой код в отдельных классах/модулях/методах, вам даже не придется иметь дело с этими типами хаков + ваш код будет более подвержен проверке.

Ответ 2

Один из способов - сохранить его в глобальной переменной:

task :obtain do
  $obtained_dir = "/tmp/obtained"
end

task :compile => :obtain do
  puts "compiling files in #{$obtained_dir}"
end

Также должны работать переменные экземпляра (т.е. @obtained_dir).

Другим способом было бы вывести код "получить" в метод следующим образом:

task :obtain do
  obtain_files
end

task :compile do
  obtained_dir = obtain_files
  puts "compiling files in #{obtained_dir}"
end

def obtain_files
  #obtain files from somewhere
  "/tmp/obtained_files"
end