Rake:处理指定源目录中的文件

时间:2014-05-19 23:57:02

标签: ruby-on-rails ruby rake rake-task rakefile

在我的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任务。 / p>

2 个答案:

答案 0 :(得分:1)

为什么不保留一个后缀数组,然后将参数追加到数组中每个元素的开头,然后创建文件列表?

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

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

file_list = FileList[*files]

prefix是传入的参数。

答案 1 :(得分:0)

我最后只使用了一个环境变量,在我的情况下使用比Rake的内置参数实现更容易。通过这种方式,我可以使用变量并使用前置路径构建我的FileList(以Cameron在其他答案中建议的方式)在任务块之外:

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