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

Допустим, у меня есть цель, которой нужно скомпилировать несколько файлов. Эта цель имеет другую цель в качестве предварительного условия, которая получает файлы. Скажем так:

task :obtain do
  # obtain files from somewhere
end

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

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


person Geo    schedule 26.02.2010    source источник


Ответы (2)


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

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

person psyho    schedule 26.02.2010
comment
Да. Вот как я это сделал. Спасибо! - person Geo; 28.02.2010
comment
Следует иметь в виду, что ENV может принимать только строки в качестве ключей и значений, поэтому, хотя это ограничение может не иметь значения в случае имен файлов, оно не может быть хорошим решением при работе с другими типами значений. - person Dologan; 20.01.2017

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

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
person Greg Campbell    schedule 26.02.2010
comment
+1 за способ, как это сделать. task :obtain совсем не похож на задачу, это просто метод, который вызывают другие люди. - person James Moore; 19.09.2011