इस पेज पर, मैक्रो और नियमों का इस्तेमाल करके, 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 का लगातार इस्तेमाल करें.
.bzl
स्टाइल गाइड का पालन करें.अपने कोड की जांच करें.
अपने उपयोगकर्ताओं की मदद करने के लिए, दस्तावेज़ जनरेट करें.
अपने कोड की परफ़ॉर्मेंस को ऑप्टिमाइज़ करें.
अपने एक्सटेंशन को अन्य लोगों के लिए डिप्लॉय करें.