2013-03-19 82 views
2

我有一些我想用Ruby编码的输入文件。来自编码的输出应该基于输入文件的文件名匹配某种模式。为了不手动执行此操作,我想使用Rake作为自动化的帮助。此外,我不想为每个输入文件指定一个任务。如何使用输入文件名与Rake生成输出文件名?

我试过一些FileList“magic”,但没有成功。这里的代码:

desc 'Create all output from specified input' 
task :encode do 
    FileList['input/*.txt'].each {|input| file "output/output_#{input}" => input} 
end 

任何人都可以帮忙吗?我在网上找不到任何关于多个输出文件作为依赖关系的东西。

回答

2

我会考虑使用Rake的rule任务,这些任务允许基于正则表达式规则动态定义任务。见rakefile rdoc页的详细信息,但这里有一个例子:

# creates the 'output' directory on demand 
directory "output" 

# define a task rule covering all the output files 
rule %r{output/output_} => ['output', proc {|task_name| "input/#{task_name.sub('output/output_', '')}.txt"}] do |t| 
    # replace this with your encoding logic 
    sh "echo 'file #{t.source}' > #{t.name}" 
end 

# define a top-level 'encode' task which depends on all the 'output/output_*' tasks 
task :encode => Dir['input/*.txt'].map {|x| "output/output_#{File.basename(x).sub('.txt', '')}"} 

然后你应该能够匹配input/*文件运行在一个目录rake encode,并具有输出文件被放置在output/output_*

+0

Thx!工作了一个奇迹。我发现了有关规则,但并没有真正知道如何触发它们。你有一个很好的例子。 – boutta 2013-03-20 07:35:53