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_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.src
创建文件 file_c<n>.dst
?
-- 其中,n 是数字数组。
如果您可以使用 sh
,您可以使用此命令将 file_c.src
复制到 file_c1.dst
、file_c2.dst
和 file_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>.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
。
我有一个 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.src
创建文件 file_c<n>.dst
?
-- 其中,n 是数字数组。
如果您可以使用 sh
,您可以使用此命令将 file_c.src
复制到 file_c1.dst
、file_c2.dst
和 file_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>.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
。