Hi,
I have a general question regarding rake:
Say I have a list of files (based on file extension), that all need to
be processed in the same way. The output of this processing is required
by a downstream task. How do I run this in rake?
My approach was:
my_files.each do |file|
target_file = ‘#{file}.transformed’
file target_file => file do
transform here
end
task :transform => target_file
end
next_file = ‘transformed_files.txt’
file next_file => :transform do
Do something with all transformed files to produce 1 output file
end
And this fails, complaining that it does not know how to build
:transform
Is this a syntactic issue? The workflow above correctly iterates over
the input files, creates transformed files and then complains that it
doesn’t know how to build :transform. I am at a loss…
Any ‘better’ ways of doing this?
On 07/12/11 09:46 , Marc H. wrote:
Do something with all transformed files to produce 1 output file
end
And this fails, complaining that it does not know how to build
:transform
Is this a syntactic issue? The workflow above correctly iterates over
the input files, creates transformed files and then complains that it
doesn’t know how to build :transform. I am at a loss…
Any ‘better’ ways of doing this?
Actually what I would do in your position would be to create rules
(since your tasks depend on file extensions):
#this rules says that if a foo.transformed Filetask is called it depends
on foo.regular
rule “.transformed” => [".regular"] do |r|
#do the processing here to create the .transformed file
r gives you the actual FileTask triggering the rule and you can get
the path out of it
end
When you have your list of files do
deps=FileList["*.regular"].gsub(".regular",".transformed") #you can
obviously do all kinds of pathname magic here
and add it to a task
task :transform => deps do
#at this point you know that all transformed files are there and waiting
end
If it’s the output file you want to tie up then
file foo.output => deps
Cheers,
V.-
Put the transform task definition in front of your each loop.
You only create the task inside this loop.
task :transform do
end
my_files.each do |file|
file …
task :transform => file
end
next_file = ‘transformed_files.txt’
file next_file => :transform do
Do something with all transformed files to produce 1 output file
end