इस पेज पर, मैक्रो और नियमों का इस्तेमाल करके BUILD भाषा को बढ़ाने का तरीका बताया गया है.
Bazel एक्सटेंशन, .bzl
पर खत्म होने वाली फ़ाइलें होती हैं. किसी एक्सटेंशन से सिंबल इंपोर्ट करने के लिए, load statement का इस्तेमाल करें.
ज़्यादा बेहतर कॉन्सेप्ट के बारे में जानने से पहले, सबसे पहले:
BUILD
और.bzl
, दोनों फ़ाइलों में इस्तेमाल की गई Starlark भाषा के बारे में पढ़ें.दो
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 का लगातार इस्तेमाल करें.
.bzl
स्टाइल गाइड का पालन करें.अपने कोड की जांच करें.
अपने उपयोगकर्ताओं की मदद करने के लिए, दस्तावेज़ जनरेट करें.
अपने कोड की परफ़ॉर्मेंस को ऑप्टिमाइज़ करें.
अपने एक्सटेंशन को अन्य लोगों के लिए डप्लॉय करें.