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

किसी समस्या की शिकायत करें सोर्स देखें Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

इस पेज पर, मैक्रो और नियमों का इस्तेमाल करके, BUILD भाषा को बढ़ाने का तरीका बताया गया है.

Bazel एक्सटेंशन, .bzl पर खत्म होने वाली फ़ाइलें होती हैं. किसी एक्सटेंशन से सिंबल इंपोर्ट करने के लिए, लोड स्टेटमेंट का इस्तेमाल करें.

ज़्यादा बेहतर कॉन्सेप्ट सीखने से पहले, पहले:

  • Starlark भाषा के बारे में पढ़ें. इसका इस्तेमाल BUILD और .bzl, दोनों फ़ाइलों में किया जाता है.

  • जानें कि दो BUILD फ़ाइलों के बीच वैरिएबल शेयर कैसे किए जा सकते हैं.

मैक्रो और नियम

मैक्रो एक ऐसा फ़ंक्शन है जो नियमों को लागू करता है. मैक्रो दो तरह के होते हैं: सिंबल मैक्रो (Bazel 8 में नया) और लेगसी मैक्रो. मैक्रो के दोनों फ़्लेवर को अलग-अलग तरीके से तय किया जाता है. हालांकि, उपयोगकर्ता के हिसाब से दोनों का काम करने का तरीका एक जैसा ही होता है. मैक्रो तब काम आता है, जब BUILD फ़ाइल में बहुत ज़्यादा बार एक ही कोड का इस्तेमाल किया गया हो या वह बहुत जटिल हो. ऐसा इसलिए, क्योंकि मैक्रो की मदद से, किसी कोड का फिर से इस्तेमाल किया जा सकता है. BUILD फ़ाइल को पढ़ने के बाद, फ़ंक्शन का आकलन किया जाता है. BUILD फ़ाइल का आकलन करने के बाद, Bazel के पास मैक्रो के बारे में बहुत कम जानकारी होती है. अगर आपका मैक्रो कोई genrule जनरेट करता है, तो Bazel का व्यवहार लगभग वैसा ही होगा, जैसे आपने BUILD फ़ाइल में genrule का एलान किया हो. (सिर्फ़ एक अपवाद है: सिंबल वाले मैक्रो में तय किए गए टारगेट के लिए, विज़िबिलिटी के खास सिमेंटिक का इस्तेमाल किया जाता है: सिंबल वाला मैक्रो, अपने इंटरनल टारगेट को बाकी पैकेज से छिपा सकता है.)

नियम, मैक्रो से ज़्यादा असरदार होता है. यह Bazel के अंदरूनी कामों को ऐक्सेस कर सकता है और इस पर पूरा कंट्रोल रख सकता है. उदाहरण के लिए, यह अन्य नियमों को जानकारी दे सकता है.

अगर आपको आसान लॉजिक का फिर से इस्तेमाल करना है, तो मैक्रो से शुरू करें. हमारा सुझाव है कि आप सिंबल मैक्रो का इस्तेमाल करें. हालांकि, अगर आपको Bazel के पुराने वर्शन के साथ काम करना है, तो ऐसा न करें. अगर कोई मैक्रो मुश्किल हो जाता है, तो उसे नियम बनाना अक्सर एक अच्छा विचार होता है. आम तौर पर, किसी नई भाषा के लिए सहायता, नियम के हिसाब से दी जाती है. नियम, बेहतर उपयोगकर्ताओं के लिए होते हैं. ज़्यादातर उपयोगकर्ताओं को कभी भी नियम लिखने की ज़रूरत नहीं पड़ती. वे सिर्फ़ मौजूदा नियमों को लोड और कॉल करते हैं.

इवैलुएशन मॉडल

किसी बिल्ड में तीन चरण होते हैं.

  • लोड होने का चरण. सबसे पहले, उन सभी एक्सटेंशन और BUILD फ़ाइलों को लोड और उनका आकलन करें जो बिल्ड के लिए ज़रूरी हैं. BUILD फ़ाइलों को लागू करने पर, नियम लागू हो जाते हैं. हर बार किसी नियम को लागू करने पर, वह ग्राफ़ में जुड़ जाता है. यहां मैक्रो का आकलन किया जाता है.

  • विश्लेषण का चरण. नियमों का कोड (उनका implementation फ़ंक्शन) लागू किया जाता है और कार्रवाइयों को लागू किया जाता है. किसी कार्रवाई से यह पता चलता है कि इनपुट के किसी सेट से आउटपुट का सेट कैसे जनरेट किया जाए. जैसे, "hello.c पर gcc चलाएं और hello.o पाएं". आपको असल निर्देशों को लागू करने से पहले, साफ़ तौर पर यह बताना होगा कि कौनसी फ़ाइलें जनरेट होंगी. दूसरे शब्दों में, विश्लेषण के चरण में, लोडिंग के चरण से जनरेट किए गए ग्राफ़ को लिया जाता है और एक ऐक्शन ग्राफ़ जनरेट किया जाता है.

  • कार्रवाई का चरण. कार्रवाइयां तब लागू की जाती हैं, जब उनके कम से कम एक आउटपुट की ज़रूरत हो. अगर कोई फ़ाइल मौजूद नहीं है या कोई कमांड एक आउटपुट जनरेट नहीं कर पाता है, तो बिल्ड पूरा नहीं होता. इस दौरान टेस्ट भी चलाए जाते हैं.

Bazel, .bzl फ़ाइलों और BUILD फ़ाइलों को पढ़ने, पार्स करने, और उनका आकलन करने के लिए, पैरलल प्रोसेसिंग का इस्तेमाल करता है. हर बिल्ड के लिए, फ़ाइल को ज़्यादा से ज़्यादा एक बार पढ़ा जाता है. साथ ही, आकलन के नतीजे को कैश मेमोरी में सेव करके उसका फिर से इस्तेमाल किया जाता है. किसी फ़ाइल का आकलन सिर्फ़ तब किया जाता है, जब उसकी सभी डिपेंडेंसी (load() स्टेटमेंट) ठीक हो गई हों. डिज़ाइन के हिसाब से, .bzl फ़ाइल को लोड करने से कोई साइड-इफ़ेक्ट नहीं दिखता. यह सिर्फ़ वैल्यू और फ़ंक्शन तय करती है.

Bazel, डिपेंडेंसी विश्लेषण का इस्तेमाल करके यह तय करता है कि कौनसी फ़ाइलें लोड की जानी चाहिए, किन नियमों का विश्लेषण किया जाना चाहिए, और कौनसी कार्रवाइयां की जानी चाहिए. उदाहरण के लिए, अगर कोई नियम ऐसी कार्रवाइयां जनरेट करता है जिनकी आपको मौजूदा बिल्ड के लिए ज़रूरत नहीं है, तो उन्हें लागू नहीं किया जाएगा.

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

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

आगे बढ़ना

मैक्रो और नियमों के अलावा, आपके पास ऐस्पेक्ट और रिपॉज़िटरी के नियम लिखने का विकल्प होता है.