2015-09-04 2 views
1

У меня есть Rakefile следующим образом -правила 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 

Это 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

Обновление: Я узнал, что нет прямой поддержки для написания правила, имеющего несколько целей (ссылка: http://hyperpolyglot.org/build).Но я чувствую, что должен быть способ сделать это ... – Ninad

+1

смотреть эту беседу Джим Вайрих, https://www.youtube.com/watch?v=KaEqZtulOus, это показывает некоторые довольно аккуратные трюки с Rake .. – 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 

одно дополнение - из сферы вашего вопроса: I есть некоторые проблемы, чтобы увидеть реальный случай использования вашего вопроса.

Если команда для генерации 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.

+0

Это именно я хотел двигаться вперед. В дополнение к этому я могу просто сказать 'task: variantants => Rake :: FileList ['file_c1.dst', 'file_c2.dst', 'file_c4.dst'] ', чтобы создать больше вариантов file_c.dst. Я запускал код, он работает. – Ninad

+0

о реальном использовании - я пытаюсь создать исходный код Verilog здесь из шаблона, передавая различные аргументы/параметры процессору шаблонов вместе с файлом шаблона, и этот шаблон является ничем иным, как .src. – Ninad

+0

Я прошел через https://www.youtube.com/watch?v=KaEqZtulOus, как было указано в @Doon, и реализованная задача с файлом - лучшее решение, поскольку его легче понять, реализовать и отладить - как упоминалось Джим в презентация. – Ninad

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 
+0

это хороший трюк. Я ищу реальную задачу/правило, где я могу делать свои вещи. Спасибо .. – Ninad

Смежные вопросы