2016-12-01 1 views
0

С макияж я могу сделать что-то вроде:Rake: автоматически удалять промежуточные файлы? (Эквивалент механизма .INTERMEDIATE сделать в?)

%.json : %.jsonnet 
    jsonnet $< -o [email protected] 

JSON_FILES = main.tf.json 

.INTERMEDIATE : $(JSON_FILES) 

plan : $(JSON_FILES) 
    terraform plan 

с этим на месте, если я бегу

make plan 

Мой файл main.tf.jsonnet будет составлен в main.tf.json (формат, который может понимать программа Terraform), Terraform будет работать, и после ее завершения файл main.tf.json будет автоматически удален.

Мне интересно, есть ли подобная функция в Rake? Возьмите это в основном, аналогичные Rakefile:

require 'rake/clean' 

rule '.json' => '.jsonnet' do |t| 
    sh "jsonnet '#{t.source}' -o '#{t.name}'" 
end 

JSON_FILES = Dir["**/*.jsonnet"].map{ |f| f.sub(/jsonnet$/, 'json')} 
CLEAN.include(JSON_FILES) 

desc "See what changes will be made (terraform plan)" 
task plan: JSON_FILES do 
    sh "terraform plan" 
end 

Если я бегу rake plan, он будет выполнять почти так же, как макияж, но он оставит main.tf.json в файловой системе. Я просто добавляю Rake::Task[:clean].execute в конце всех соответствующих задач, но это немного хаки. Есть ли лучший способ сделать это?

ответ

0

Я придумал другой вид грубого хака, чтобы сделать вид, что я хочу ...

Правила теперь выглядит следующим образом:

$needs_clean = false 

rule '.json' => '.jsonnet' do |t| 
    $needs_clean = true 
    sh "jsonnet '#{t.source}' -o '#{t.name}'" 
end 

И конец Rakefile имеет это:

at_exit { Rake::Task[:clean].invoke if $needs_clean } 

Я не самый большой поклонник этого решения, но это, кажется, работает до сих пор ...

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