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

समस्या की शिकायत करें सोर्स देखें

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

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

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

आगे बढ़ें

मैक्रो और नियमों के अलावा, हो सकता है कि आप विश्लेषण और डेटा स्टोर करने के नियम लिखना चाहें.