एक्सटेंशन की खास जानकारी

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

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

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

बेहतर कॉन्सेप्ट सीखने से पहले:

  • 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 की फ़ाइल को डिज़ाइन करने से, साइट पर कोई असर नहीं पड़ता. यह सिर्फ़ वैल्यू और फ़ंक्शन के बारे में बताता है.

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

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

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

आगे जाना

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