我有一个Rakefile如下 -
src_files = Rake::FileList["*.src"]
dst_files = src_files.ext 'dst'
task :default => dst_files
rule '.dst' => '.src' do |task|
sh "cmd -o #{task.name} -i #{task.source}"
end
此Rakefile可以找到所有.src文件并生成相应的.dst文件。
现在,
从.src
个文件列表file_a.src, file_b.src, file_c.src
,我想要 -
file_a.src
创建file_a.dst
(适用于当前规则)file_b.src
创建file_b.dst
(适用于当前规则)file_c.src
创建file_c1.dst, file_c2.dst
和file_c3.dst
(?!)问题是 -
如何编写规则以从file_c<n>.dst
创建文件file_c.src
?
- 其中,n是数字数组。
答案 0 :(得分:1)
你需要一个规则吗? 您可以尝试为其创建多个文件任务:
n = 1..6 #Your n-Array
n.each do |i|
targetfile = 'file_c%i.dst' % i #Define the file to be created
desc 'Create %s based n %s' % [ targetfile, 'file_c.src']
file targetfile => 'file_c.src' do |task| #Define task to create targetfile
puts "cmd1 -o #{task.name} -i #{task.source}" #Command to create targetfile
end
end
在我的测试中,将它与已定义的规则结合起来没有问题。
在我的完整测试代码下面:
require 'rake'
src_files = Rake::FileList["*.src"]
dst_files = src_files.ext 'dst'
task :default => dst_files
def build_dst(dst, src)
puts "cmd -o #{dst} -i #{src}" #Command to create targetfile
File.open(dst,'w'){|f|} #Dummy to simulate generation
end
rule '.dst' => '.src' do |task|
build_dst task.name, task.source
end
N = 1..6 #array of numbers.
N.each do |i|
targetfile = 'file_c%i.dst' % i #Define the file to be created
desc 'Create %s based n %s' % [ targetfile, 'file_c.src']
file targetfile => 'file_c.src' do |task| #Define task to create targetfile
build_dst task.name, task.source
end
end
#Make dummy-sources.
File.open('file_c.src','w'){|f|}
File.open('x.src','w'){|f|}
Rake.application['x.dst'].invoke
Rake.application['file_c3.dst'].invoke
您将看到,命令按预期排出:
cmd -o x.dst -i x.src
cmd -o file_c3.dst -i file_c.src
一个补充 - 超出了您的问题范围: 我有一些问题需要查看您问题的真实用例。
如果生成file_c<n>.dst
的命令仅依赖于相同的源代码,那么生成的dst文件将是相同的 - 您只需复制结果即可。我希望在家属方面存在其他一些差异。
如果您的file_c<n>.dst
取决于file_c<n>.src
和file_c.src
,那么您可以使用以下内容:
require 'rake'
rule '.dst' => '.src' do |task|
puts "cmd -o #{task.name} -i #{task.prerequisites}" #Command to create targetfile
File.open(task.name,'w'){} #Dummy to simulate generation
end
#Add additional prerequsites (cold also defined generic)
file 'file_c3.dst' => 'file_c.src'
#Make dummy-sources.
#~ File.open('file_c.src','w'){|f|}
#~ File.open('file_c3.src','w'){|f|}
Rake.application['file_c3.dst'].invoke
我添加了其他先决条件,并将task.source
替换为task.prerequisites
。
答案 1 :(得分:0)
如果您使用sh
,则可以使用此命令将file_c.src
复制到file_c1.dst
,file_c2.dst
和file_c3.dst
:
cat file_c.src | tee file_c{1,2,3}.dst