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