इस पेज पर, मैक्रो और नियमों का इस्तेमाल करके, 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, डिपेंडेंसी के विश्लेषण का इस्तेमाल करके यह पता लगाता है कि किन फ़ाइलों को लोड करना है, किन नियमों का विश्लेषण करना है, और किन कार्रवाइयों को एक्ज़ीक्यूट करना है. उदाहरण के लिए, अगर कोई नियम ऐसी कार्रवाइयां जनरेट करता है जिनकी आपको मौजूदा बिल्ड के लिए ज़रूरत नहीं है, तो उन्हें एक्ज़ीक्यूट नहीं किया जाएगा.
एक्सटेंशन बनाना
कुछ कोड को फिर से इस्तेमाल करने के लिए, अपना पहला मैक्रो बनाएं. इसके बाद, मैक्रो के बारे में ज़्यादा जानें और "कस्टम वर्ब" बनाने के लिए उनका इस्तेमाल करें.
नियमों का ट्यूटोरियल देखें नियमों के साथ काम करना शुरू करने के लिए. इसके बाद, नियमों के कॉन्सेप्ट के बारे में ज़्यादा पढ़ें.
अपने एक्सटेंशन लिखते समय, नीचे दिए गए दोनों लिंक बहुत काम आएंगे. इन्हें अपने पास रखें:
ज़्यादा जानकारी
मैक्रो और नियमों के अलावा, आपके पास पहलुओं और रिपॉज़िटरी के नियम लिखने का विकल्प भी होता है.
अपने कोड को फ़ॉर्मैट करने और उसमें गड़बड़ियां ढूंढने के लिए, Buildifier का लगातार इस्तेमाल करें.