在我的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>
答案 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