एक्सटेंशन की खास जानकारी

इस पेज में मैक्रो और नियमों का इस्तेमाल करके Build भाषा को बढ़ाने का तरीका बताया गया है.

बैजल एक्सटेंशन, .bzl से खत्म होने वाली फ़ाइलें हैं. एक्सटेंशन से कोई चिह्न इंपोर्ट करने के लिए, लोड स्टेटमेंट का इस्तेमाल करें.

बेहतर तकनीकों का इस्तेमाल करने से पहले, ये काम करें:

  • Starlark भाषा के बारे में पढ़ें, जिसका उपयोग BUILD और .bzl दोनों फ़ाइलों में किया जाता है.

  • जानें कि आप दो BUILD फ़ाइलों के बीच वैरिएबल कैसे शेयर कर सकते हैं.

मैक्रो और नियम

मैक्रो एक फ़ंक्शन है, जो नियमों को त्वरित बना देता है. यह तब काम आता है, जब BUILD फ़ाइल बहुत ज़्यादा बार या मुश्किल हो जाती है. इससे आप कुछ कोड को फिर से इस्तेमाल कर सकते हैं. BUILD फ़ाइल के पढ़े जाते ही फ़ंक्शन का मूल्यांकन किया जाता है. BUILD फ़ाइल का मूल्यांकन करने के बाद, Bazel में मैक्रो के बारे में बहुत कम जानकारी है: अगर आपका मैक्रो genrule जनरेट करता है, तो बैजल उसी तरह काम करेगा जैसे आपने genrule लिखा है. इससे bazel query, जनरेट की गई genrule को ही सूची में शामिल करेगा.

मैक्रो की तुलना में नियम ज़्यादा असरदार होता है. यह Bezel की अंदरूनी चीज़ें ऐक्सेस कर सकता है. साथ ही, यह तय कर सकता है कि क्या चल रहा है. उदाहरण के लिए, इसमें अन्य नियमों की जानकारी भेजी जा सकती है.

अगर आप आसान तर्क का दोबारा इस्तेमाल करना चाहते हैं, तो मैक्रो से शुरू करें. अगर कोई मैक्रो जटिल हो जाता है, तो उसे नियम बनाना अक्सर एक अच्छा विकल्प होता है. आम तौर पर, नई भाषा के लिए सहायता नियम लागू होता है. नियम बेहतर उपयोगकर्ताओं के लिए हैं और ज़्यादातर उपयोगकर्ताओं को कभी भी लिखने की ज़रूरत नहीं होगी; वे केवल मौजूदा नियमों को लोड करेंगे और कॉल करेंगे.

इवैलुएशन मॉडल

बिल्ड में तीन चरण होते हैं.

  • लोड करने का चरण. सबसे पहले, एक्सटेंशन के लिए ज़रूरी सभी एक्सटेंशन और सभी BUILD फ़ाइल लोड करें और उनका मूल्यांकन करें. BUILD फ़ाइलों को एक्ज़ीक्यूट करने से बस नियमों का उल्लंघन होता है (जब भी कोई नियम कहा जाता है, तो उसे ग्राफ़ में जोड़ दिया जाता है). यहां मैक्रो का मूल्यांकन किया जाता है.

  • विश्लेषण का चरण. नियमों का कोड लागू किया जाता है (उनकी implementationफ़ंक्शन) और कार्रवाइयां तुरंत कर दी जाती हैं. एक कार्रवाई, इनपुट के सेट से आउटपुट के सेट को जनरेट करने का तरीका बताती है, जैसे कि "हैलो.सीसी पर gcc चलाएं और हैलो.o पाएं". असली निर्देशों का इस्तेमाल करने से पहले, आपको साफ़ तौर पर यह बताना होगा कि कौनसी फ़ाइलें जनरेट होंगी. दूसरे शब्दों में, विश्लेषण चरण लोड होने के चरण से जनरेट होने वाले ग्राफ़ को लेकर, एक कार्रवाई ग्राफ़ बनाता है.

  • एक्ज़ीक्यूशन का चरण. कार्रवाइयां तब की जाती हैं, जब कम से कम एक आउटपुट ज़रूरी हो. अगर कोई फ़ाइल मौजूद नहीं है या कोई निर्देश एक आउटपुट जनरेट नहीं कर पाता, तो बिल्ड नहीं हो पाएगा. इस चरण में टेस्ट भी चलाए जाते हैं.

बैजल, .bzl फ़ाइलों और BUILD फ़ाइलों को पढ़ने, पार्स करने, और उनका मूल्यांकन करने के लिए पैरललिज़्म का इस्तेमाल करती हैं. हर बिल्ड को फ़ाइल एक बार पढ़ी जाती है और इवैलुएशन का नतीजा कैश किया जाता है और फिर से इस्तेमाल किया जाता है. किसी फ़ाइल का मूल्यांकन सिर्फ़ तब किया जाता है, जब उसकी सभी डिपेंडेंसी (load() स्टेटमेंट) ठीक हो जाएं. डिज़ाइन के ज़रिए, .bzl फ़ाइल को लोड करने पर कोई प्रभाव नहीं पड़ता. इससे सिर्फ़ मान और फ़ंक्शन तय होते हैं.

बैजल चालाक होने की कोशिश करता है: यह इस बात पर निर्भर करने के लिए निर्भरता का विश्लेषण करता है कि किन फ़ाइलों को लोड करना है, किन नियमों का विश्लेषण करना है और किन कार्रवाइयों को लागू करना चाहिए. उदाहरण के लिए, अगर कोई नियम ऐसी कार्रवाइयां जनरेट करता है जिनकी आपको मौजूदा बिल्ड के लिए ज़रूरत नहीं है, तो उन्हें लागू नहीं किया जाएगा.

एक्सटेंशन बनाना

अपने खुद के एक्सटेंशन लिखते समय नीचे दिए गए दो लिंक बहुत उपयोगी होंगे. उन्हें पहुंच में रखें:

आगे जा रहे हैं

इसके अलावामैक्रो औरनियम, हो सकता है कि आप लिखना चाहें पहलू औरडेटा स्टोर करने की जगह से जुड़े नियम चुनें.