एक्सटेंशन ओवरव्यू

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

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

ज़्यादा बेहतर कॉन्सेप्ट के बारे में जानने से पहले, यह काम करें:

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

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

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

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

कोई नियम, मैक्रो से ज़्यादा पावरफ़ुल होता है. यह Bazel के इंटरनल को ऐक्सेस कर सकता है और इस पर पूरी तरह से कंट्रोल कर सकता है कि क्या हो रहा है. उदाहरण के लिए, यह अन्य नियमों को जानकारी पास कर सकता है.

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

आकलन मॉडल

किसी बिल्ड में तीन फ़ेज़ होते हैं.

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

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

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

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

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

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

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

प्रॉम्प्ट की मदद से गहराई से जानें

मैक्रो और नियमों के अलावा, आपके पास पहलुओं और रिपॉज़िटरी के नियम लिखने का विकल्प भी होता है.