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

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

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

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

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

  • BUILD और .bzl, दोनों फ़ाइलों में इस्तेमाल की गई Starlark भाषा के बारे में पढ़ें.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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