Saya menyarankan untuk tidak membuat tugas debug dan rilis umum jika proyek benar-benar sesuatu yang dikompilasi dan menghasilkan file. Anda harus pergi dengan tugas file yang cukup bisa dilakukan dalam contoh Anda, saat Anda menyatakan, bahwa output Anda masuk ke direktori yang berbeda. Katakan proyek Anda hanya mengkompilasi file test.c untuk keluar / debug / test.out dan keluar / lepaskan / test.out dengan gcc Anda dapat mengatur proyek Anda seperti ini:
WAYS = ['debug', 'release']
FLAGS = {}
FLAGS['debug'] = '-g'
FLAGS['release'] = '-O'
def out_dir(way)
File.join('out', way)
end
def out_file(way)
File.join(out_dir(way), 'test.out')
end
WAYS.each do |way|
desc "create output directory for #{way}"
directory out_dir(way)
desc "build in the #{way}-way"
file out_file(way) => [out_dir(way), 'test.c'] do |t|
sh "gcc #{FLAGS[way]} -c test.c -o #{t.name}"
end
end
desc 'build all ways'
task :all => WAYS.map{|way|out_file(way)}
task :default => [:all]
Pengaturan ini dapat digunakan seperti:
rake all # (builds debug and release)
rake debug # (builds only debug)
rake release # (builds only release)
Ini sedikit lebih seperti yang diminta, tetapi menunjukkan poin saya:
- direktori keluaran dibuat, jika perlu.
- file hanya dikompilasi ulang jika diperlukan (contoh ini hanya benar untuk file test.c yang paling sederhana).
- Anda memiliki semua tugas siap jika Anda ingin memicu rilis atau build debug.
- contoh ini mencakup cara untuk juga mendefinisikan perbedaan kecil antara debug dan rilis-build.
- tidak perlu mengaktifkan kembali tugas build yang dipisah dengan variabel global, karena sekarang build yang berbeda memiliki tugas yang berbeda. codereuse dari build-task dilakukan dengan menggunakan kembali kode untuk mendefinisikan build-task. lihat bagaimana loop tidak menjalankan tugas yang sama dua kali, tetapi alih-alih membuat tugas, yang nantinya dapat dipicu (baik oleh semua-tugas atau memilih salah satu dari mereka di baris perintah rake).