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

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

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

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

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

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

मैक्रो एक ऐसा फ़ंक्शन है जो नियमों को लागू करता है. यह तब काम का होता है, जब BUILD फ़ाइल में बहुत ज़्यादा दोहराव हो रहा हो या वह बहुत जटिल हो. ऐसा होने पर, कुछ कोड का फिर से इस्तेमाल किया जा सकता है. BUILD फ़ाइल के पढ़े जाते ही, फ़ंक्शन का आकलन हो जाता है. इस तारीख के बाद BUILD फ़ाइल का मूल्यांकन करते समय, Basel के पास मैक्रो के बारे में कम जानकारी होती है: अगर आपका मैक्रो genrule जनरेट करता है, तो बेज़ल इस तरह से काम करेंगे, जैसे कि आपने genrule. इस वजह से, bazel query सिर्फ़ जनरेट किए गए genrule को ही सूची में शामिल करेगा.

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

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

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

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

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

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

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

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

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

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

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

आगे बढ़ते रहें

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