रिपॉज़िटरी, फ़ाइल फ़ोल्डर, पैकेज, और टारगेट

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

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

डेटा स्टोर करने की जगह

Bazel बिल्ड में इस्तेमाल की जाने वाली सोर्स फ़ाइलें डेटा स्टोर करने की जगहों में व्यवस्थित की जाती हैं. इन्हें अक्सर डेटा स्टोर करने की जगह में छोटा किया जाता है. रेपो एक डायरेक्ट्री ट्री होता है, जिसके रूट में बाउंड्री मार्कर फ़ाइल होती है. ऐसी बाउंड्री मार्कर फ़ाइल, MODULE.bazel, REPO.bazel या लेगसी कॉन्टेक्स्ट में WORKSPACE या WORKSPACE.bazel हो सकती है.

जिस रेपो में मौजूदा Bazel कमांड चलाया जा रहा है उसे मुख्य रेपो कहा जाता है. अन्य, (बाहरी) डेटा स्टोर करने के लिए, डेटा स्टोर करने के नियमों से तय किया जाता है. ज़्यादा जानकारी के लिए, बाहरी डिपेंडेंसी के बारे में खास जानकारी देखें.

फ़ाइल फ़ोल्डर

वर्कस्पेस एक ही मुख्य रेपो से चलाए जाने वाले सभी Bazel कमांड से शेयर किया जाने वाला एनवायरमेंट है. इसमें मुख्य डेटा स्टोर करने की जगह और तय किए गए सभी बाहरी रिपो का सेट शामिल होता है.

ध्यान दें कि पुराने समय से "डेटा स्टोर करने की जगह" और "फ़ाइल फ़ोल्डर" के सिद्धांत आपस में मिलते-जुलते रहे हैं. "वर्कस्पेस" शब्द का इस्तेमाल, अक्सर मुख्य डेटा स्टोर करने के लिए किया जाता है. कभी-कभी इसे "डेटा स्टोर करने की जगह" के समान भी इस्तेमाल किया जाता है.

पैकेज

डेटा स्टोर करने की जगह में, कोड व्यवस्थित करने की मुख्य यूनिट package होती है. पैकेज, संबंधित फ़ाइलों का संग्रह होता है. इसमें, आउटपुट आर्टफ़ैक्ट बनाने के लिए इस्तेमाल किए जाने के तरीकों की जानकारी भी दी जाती है.

पैकेज वह डायरेक्ट्री होती है जिसमें BUILD या BUILD.bazel नाम की BUILD फ़ाइल होती है. पैकेज में, उसकी डायरेक्ट्री की सभी फ़ाइलें और उसके नीचे की सभी सबडायरेक्ट्री शामिल होती हैं. हालांकि, इनमें वे सब-डायरेक्ट्री शामिल नहीं होतीं जिनमें BUILD फ़ाइल होती है. इस परिभाषा के हिसाब से, कोई भी फ़ाइल या डायरेक्ट्री दो अलग-अलग पैकेज का हिस्सा नहीं हो सकती.

उदाहरण के लिए, इस डायरेक्ट्री ट्री में दो पैकेज my/app और सबपैकेज my/app/tests हैं. ध्यान दें कि my/app/data कोई पैकेज नहीं है, लेकिन पैकेज my/app से जुड़ी डायरेक्ट्री है.

src/my/app/BUILD
src/my/app/app.cc
src/my/app/data/input.txt
src/my/app/tests/BUILD
src/my/app/tests/test.cc

टारगेट

पैकेज, टारगेट का कंटेनर होता है. यह पैकेज की BUILD फ़ाइल में मौजूद होता है. ज़्यादातर टारगेट, दो मुख्य टाइप, फ़ाइलें और नियम में से एक होते हैं.

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

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

अगर किसी नियम के लिए इनपुट कोई सोर्स फ़ाइल है या जनरेट की गई फ़ाइल, ज़्यादातर मामलों में असरदार नहीं है, तो सिर्फ़ उस फ़ाइल का कॉन्टेंट मायने रखता है. इस तथ्य से, किसी नियम के तहत जनरेट की गई फ़ाइल से, कॉम्प्लेक्स सोर्स फ़ाइल को बदलना आसान हो जाता है. उदाहरण के लिए, ऐसा तब होता है, जब बहुत ज़्यादा स्ट्रक्चर वाली फ़ाइल को मैन्युअल तरीके से मैनेज करने का बोझ बहुत बढ़ जाता है और कोई व्यक्ति इसे पाने के लिए कोई प्रोग्राम लिखता है. इस फ़ाइल का इस्तेमाल करने वालों के लिए, किसी भी तरह के बदलाव की ज़रूरत नहीं है. इसके ठीक उलट, जनरेट की गई फ़ाइल को सिर्फ़ लोकल बदलावों के साथ सोर्स फ़ाइल से आसानी से बदला जा सकता है.

किसी नियम के इनपुट में दूसरे नियम भी शामिल हो सकते हैं. ऐसे मिलते-जुलते संबंधों का सही मतलब अक्सर काफ़ी जटिल होता है. साथ ही, यह भाषा या नियम पर निर्भर होता है, लेकिन आम तौर पर यह आसान है: इनपुट के लिए C++ लाइब्रेरी नियम A में दूसरा C++ लाइब्रेरी नियम B हो सकता है. इस डिपेंडेंसी का असर यह होता है कि कंपाइलेशन के दौरान B की हेडर फ़ाइलें A के लिए उपलब्ध हो जाती हैं, लिंक करने के दौरान B के चिह्न A को उपलब्ध हो जाते हैं, और एक्ज़ीक्यूशन के दौरान B का रनटाइम डेटा A के लिए उपलब्ध हो जाता है.

सभी नियमों में एक बदलाव यह है कि किसी नियम से जनरेट की जाने वाली फ़ाइलें हमेशा उसी पैकेज की होती हैं, जो नियम खुद में होता है; फ़ाइलों को किसी दूसरे पैकेज में जनरेट नहीं किया जा सकता. हालांकि, किसी नियम के इनपुट का किसी दूसरे पैकेज से आना आम बात है.

पैकेज ग्रुप, पैकेज के ऐसे सेट होते हैं जिनका मकसद कुछ खास नियमों की सुलभता को सीमित करना होता है. पैकेज ग्रुप, package_group फ़ंक्शन से तय किए जाते हैं. उनकी तीन प्रॉपर्टी होती हैं: उनमें शामिल पैकेज की सूची, उनका नाम, और उनमें शामिल दूसरे पैकेज ग्रुप. इन्हें रेफ़र करने के लिए, नियमों के visibility एट्रिब्यूट या package फ़ंक्शन के default_visibility एट्रिब्यूट से ही रेफ़रंस लिए जा सकते हैं. ये फ़ाइलें, न तो जनरेट करती हैं और न ही फ़ाइलों का इस्तेमाल करती हैं. ज़्यादा जानकारी के लिए, package_group दस्तावेज़ देखें.

लेबल