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

किसी समस्या की शिकायत करें सोर्स देखें Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

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

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

आगे बढ़ना

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