Rake 规则从单个 source/dependency 生成多个目标

Rake rules to generate multiple targets from single source/dependency

我有一个 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_c.src 创建文件 file_c<n>.dst

-- 其中,n 是数字数组。

如果您可以使用 sh,您可以使用此命令将 file_c.src 复制到 file_c1.dstfile_c2.dstfile_c3.dst

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

你需要一个规则吗? 您可以尝试为其创建多个文件任务:

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