Rake: Обработка файлов в указанном исходном каталоге

В моем проекте Rails у меня есть определенный список внешних файлов, которые я хочу обработать с помощью Rake. Моя цель - указать исходный каталог этих файлов в качестве аргумента следующим образом:

rake foofiles:process[vendor/sources]

В настоящее время я указываю имена файлов (и их относительные пути в исходном каталоге), используя FileList, назначенный константе:

REQUIRED_FILES = FileList[
  'blah.csv',
  'subdir/something.csv',
  'subdir/monkeys/foo.bar',
  ...
]

Как я могу добавить к каждому из этих файлов аргумент моего исходного каталога, чтобы я мог создать задачу, которая зависит от этих файлов, существующих в этом каталоге? (в идеале ничего бы не произошло, если бы не присутствовали все эти файлы)

Например, если бы я использовал команду rake, как указано выше, мне нужно, чтобы моя задача зависела от vendor/sources/blah.csv, vendor/sources/subdir/something.csv, vendor/sources/subdir/monkeys/foo.bar и т. д.

Изменить: добавление префикса к каждому элементу в массиве/списке относительно тривиально, я больше не понимаю, как структурировать свои задачи и их зависимости, чтобы я мог фактически получить доступ к аргументу исходной папки. Я предоставил, а затем использую новый добавленный список файлов в качестве зависимости для задачи обработки, которая фактически выполняет работу.

Основная вызываемая задача должна выглядеть примерно так, если мне нужен синтаксис, который я использовал вверху:

namespace :foofiles do

  task :process, [:source_directory] => [???, my_newly_prepended_file_list] do |t, args|
    # Do stuff
  end

end

Но я не знаю, как предоставить аргумент :source_directory задаче, которая выполняет добавление, а затем впоследствии вернуть список добавленных файлов задаче :process в качестве зависимости.


person Inkling    schedule 19.05.2014    source источник
comment
Что вы имеете в виду, говоря, что мне нужно, чтобы моя задача зависела от vendor/sources/blah.csv, vendor/sources/subdir/something.csv, vendor/sources/subdir/monkeys/foo.bar и т. д.? Вы хотите, чтобы эти файлы передавались в качестве аргумента вашей rake-задаче, или вы говорите о зависимостях между rake-задачами или вообще о чем-то другом?   -  person Cameron Martin    schedule 28.05.2014


Ответы (2)


Почему бы просто не сохранить массив суффиксов, затем добавить аргумент в начало каждого элемента в массиве, а затем создать список файлов?

suffixes = [
  'blah.csv',
  'subdir/something.csv',
  'subdir/monkeys/foo.bar',
]

files = suffixes.map { |suffix| File.join(prefix, suffix) }

file_list = FileList[*files]

Где prefix — переданный аргумент.

person Cameron Martin    schedule 20.05.2014
comment
Я отредактировал свой вопрос. Меня больше смущает общая структура задачи/зависимости, поскольку она относится к моему делу. - person Inkling; 20.05.2014

В итоге я просто использовал переменную окружения, в моем случае с ней гораздо проще работать, чем со встроенной реализацией аргументов Rake. Таким образом, я могу работать с переменной и создавать свой FileList с добавленным путем (как Кэмерон предложил в другом ответе) вне блока задач:

namespace :foofiles do

  REQUIRED_FILES = [...]
  source_directory = ENV['SOURCEDIR'] || 'vendor/sources'

  source_files = FileList[REQUIRED_FILES.map { |relative_path| File.join source_directory, relative_path }]
  # Note: FileList can take an array inside the square brackets without needing the splat (*) operator

  task process: source_files do
    ...
  end

end

Итак, теперь я могу вызвать его из терминала следующим образом:

SOURCEDIR=some/folder rake foofiles:process
person Inkling    schedule 29.05.2014