Rake规则从单个源/依赖项生成多个目标

时间:2015-09-04 10:22:04

标签: ruby rake

我有一个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.dstfile_c3.dst(?!)

问题是 -

如何编写规则以从file_c<n>.dst创建文件file_c.src

- 其中,n是数字数组。

2 个答案:

答案 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>.srcfile_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.dstfile_c2.dstfile_c3.dst

cat file_c.src | tee file_c{1,2,3}.dst