2015-09-04 28 views
1

我有一個Rake文件如下 -耙規則生成多個目標從單一的源/依賴性

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 

這Rake文件可以找到所有的.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.srcfile_c<n>.dst

- 其中,n是數組數組。

+0

更新:我瞭解到,沒有對具有多個目標的編寫規則的直接支持(參考:http://hyperpolyglot.org/build)。但我覺得應該有辦法做到這一點... – Ninad

+1

觀看吉姆Weirich這個談話,https://www.youtube.com/watch?v=KaEqZtulOus它顯示了一些漂亮的整潔技巧與耙子.. – Doon

+0

@Doon,謝謝。 '動力耙'!? :)吉姆一如既往的精彩演講。現在我明白了文件任務和規則之間的區別 - 而且應該讓規則變得非常簡單,而是將文件任務用於任何比具有不同擴展名更復雜的任務。 – Ninad

回答

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 

在我的測試我沒有問題,將其與已定義的規則結合起來。

下面我的完整testcode:

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 

你會看到,這些命令exectuted預期:

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.prerequisites取代task.source

+0

這正是我想要前進。最重要的是,我可以說'task:variants => Rake :: FileList ['file_c1.dst','file_c2.dst','file_c4.dst'] '來創建更多的file_c.dst變體。我運行代碼,它的工作原理。 – Ninad

+0

關於實際用例 - 我試圖通過將各種參數/參數與模板文件一起傳遞給模板來創建Verilog源代碼,並且此模板不過是.src。 – Ninad

+0

正如@Doon指出的那樣,我通過https://www.youtube.com/watch?v=KaEqZtulOus,並認識到文件任務是一個更好的解決方案,因爲它更易於理解,實現和調試 - 正如Jim在演示文稿。 – Ninad

0

如果你確定使用sh,您可以使用此命令file_c.src複製到file_c1.dstfile_c2.dstfile_c3.dst

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

這是一個不錯的訣竅。我正在尋找的是一個真正的任務/規則,我可以做我的東西。謝謝.. – Ninad