मैं सुझाव दूंगा कि सामान्य डिबग न बनाएं और कार्य जारी करें यदि परियोजना वास्तव में कुछ है जो संकलित हो जाती है और इसलिए फाइलों में परिणाम होता है। आपको फ़ाइल-कार्यों के साथ जाना चाहिए जो आपके उदाहरण में काफी उल्लेखनीय है, जैसा कि आप कहते हैं, कि आपका आउटपुट अलग-अलग निर्देशिकाओं में जाता है। कहते हैं कि आपकी परियोजना बस एक test.c फ़ाइल को बाहर / डीबग / टेस्ट करने के लिए संकलित करती है और बाहर / जारी / परीक्षण करें। इस प्रकार आप अपने प्रोजेक्ट को इस तरह सेटअप कर सकते हैं:
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]
इस सेटअप का उपयोग इस तरह किया जा सकता है:
rake all # (builds debug and release)
rake debug # (builds only debug)
rake release # (builds only release)
यह थोड़ा और अधिक के लिए कहा जाता है, लेकिन मेरी बातों को दर्शाता है:
- आउटपुट डायरेक्टरीज़ आवश्यक के रूप में बनाई गई हैं।
- यदि आवश्यक हो तो फ़ाइलें केवल recompiled हैं (यह उदाहरण केवल test.c फ़ाइलों के सबसे सरल के लिए सही है)।
- यदि आप रिलीज़ बिल्ड या डीबग बिल्ड को ट्रिगर करना चाहते हैं, तो आपके पास आसानी से सभी कार्य हैं।
- इस उदाहरण में डिबग और रिलीज़-बिल्ड के बीच छोटे अंतर को भी परिभाषित करने का एक तरीका शामिल है।
- एक बिल्ड-टास्क को फिर से उपयोग करने की आवश्यकता नहीं है जो एक वैश्विक चर के साथ पैराट्राइज्ड है, क्योंकि अब अलग-अलग बिल्ड में अलग-अलग कार्य हैं। बिल्ड-टास्क का कोडरेक बिल्ड-कार्यों को परिभाषित करने के लिए कोड का पुन: उपयोग करके किया जाता है। देखें कि लूप एक ही कार्य को दो बार कैसे निष्पादित नहीं करता है, बल्कि बनाए गए कार्य हैं, जिसे बाद में ट्रिगर किया जा सकता है (या तो सभी कार्य द्वारा या रेक कमांडलाइन पर उनमें से किसी एक को चुना जा सकता है)।