Saya memiliki Rakefile yang mengkompilasi proyek dalam dua cara, sesuai dengan variabel global $build_type
, yang dapat :debug
atau :release
(hasilnya masuk dalam direktori terpisah):
task :build => [:some_other_tasks] do
end
Saya ingin membuat tugas yang mengkompilasi proyek dengan kedua konfigurasi pada gilirannya, sesuatu seperti ini:
task :build_all do
[ :debug, :release ].each do |t|
$build_type = t
# call task :build with all the tasks it depends on (?)
end
end
Apakah ada cara untuk memanggil tugas seolah-olah itu adalah metode? Atau bagaimana saya bisa mencapai hal serupa?
Rake::Task["build"].invoke
bisa jauh lebih berkinerja daripada menggunakansystem rake build
karena tidak harus membuat utas baru dan memuat lingkungan Rails, yangsystem rake build
memang harus dilakukan.Jawaban:
Jika Anda memerlukan tugas untuk berperilaku sebagai metode, bagaimana dengan menggunakan metode yang sebenarnya?
Jika Anda lebih suka berpegang pada
rake
idiom, berikut adalah kemungkinan Anda, disusun dari jawaban masa lalu:Ini selalu mengeksekusi tugas, tetapi tidak mengeksekusi dependensinya:
Ini mengeksekusi dependensi, tetapi hanya mengeksekusi tugas jika belum dipanggil:
Ini pertama-tama akan me-reset status sudah_invoked tugas, memungkinkan tugas untuk kemudian dieksekusi lagi, dependensi dan semua:
Perhatikan bahwa dependensi yang sudah dipanggil tidak dieksekusi ulang secara otomatis kecuali diaktifkan kembali. Di Rake> = 10.3.2, Anda dapat menggunakan yang berikut untuk mengaktifkannya kembali:
sumber
Rake::Task['db:reset'].invoke
Rake::Task['with:args'].invoke("pizza")
ENV['VERSION'] = '20110408170816'; Rake::Task['db:migrate'].invoke
Lihat di sini untuk penjelasan lebih lanjut.#reenable()
tidak mengaktifkan kembali pre-req's, dan membutuhkannya. Tambahan ini untuk Rake (> = 10.3.2),#all_prerequisite_tasks()
akan mengulangi semua tugas, termasuk pra-req tentang pra-req. Jadi,Rake::Task[task].all_prerequisite_tasks.each &:reenable
rake db:reset db:migrate
misalnya). Bisakah Anda melakukan sesuatu seperti:Rake::Task["db:reset", "db:migrate"].invoke
sebagai contoh:
sumber
Itu seharusnya memilah Anda, hanya membutuhkan hal yang sama sendiri.
sumber
sumber
sumber
Jika Anda ingin setiap tugas dijalankan terlepas dari kegagalan, Anda dapat melakukan sesuatu seperti:
sumber
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:
Pengaturan ini dapat digunakan seperti:
Ini sedikit lebih seperti yang diminta, tetapi menunjukkan poin saya:
sumber