2013-03-19 58 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

相關問題