Baze, सोर्स कोड से सॉफ़्टवेयर बनाता है. यह सॉफ़्टवेयर एक डायरेक्ट्री ट्री में व्यवस्थित करके बनाया जाता है, जिसे Workspace कहा जाता है. फ़ाइलों को Workspace में, पैकेज के नेस्ट किए गए क्रम में व्यवस्थित किया जाता है. हर पैकेज एक डायरेक्ट्री होती है, जिसमें मिलती-जुलती सोर्स फ़ाइलों का एक सेट और एक BUILD
फ़ाइल होती है. BUILD
फ़ाइल से पता चलता है कि सोर्स से कौनसे सॉफ़्टवेयर आउटपुट बनाए जा सकते हैं.
Workspace
वर्कस्पेस आपके फ़ाइल सिस्टम पर मौजूद एक डायरेक्ट्री ट्री होता है. इसमें उस सॉफ़्टवेयर की सोर्स फ़ाइलें शामिल होती हैं जिसे आपको बनाना है. हर फ़ाइल फ़ोल्डर में, WORKSPACE
नाम की एक टेक्स्ट फ़ाइल होती है. यह फ़ाइल खाली हो सकती है या इसमें आउटपुट बनाने के लिए ज़रूरी बाहरी डिपेंडेंसी के रेफ़रंस हो सकते हैं.
जिन डायरेक्ट्री में WORKSPACE
नाम की फ़ाइल होती है उन्हें वर्कस्पेस की रूट माना जाता है. इसलिए, Bazel किसी फ़ाइल फ़ोल्डर में मौजूद WORKSPACE
फ़ाइल के रूट डायरेक्ट्री में मौजूद किसी भी डायरेक्ट्री ट्री को अनदेखा करता है, क्योंकि वे एक और फ़ाइल फ़ोल्डर बनाते हैं.
Bazel, WORKSPACE
फ़ाइल के उपनाम के तौर पर WORKSPACE.bazel
फ़ाइल का भी इस्तेमाल करता है.
अगर दोनों फ़ाइलें मौजूद हैं, तो WORKSPACE.bazel
का इस्तेमाल किया जाता है.
डेटा स्टोर करने की जगह
कोड को डेटा स्टोर करने की जगह में व्यवस्थित किया जाता है. WORKSPACE
फ़ाइल वाली डायरेक्ट्री, मुख्य रिपॉज़िटरी की रूट होती है. इसे @
भी कहा जाता है. अन्य (बाहरी) रिपॉज़िटरी, Workspace के नियमों का इस्तेमाल करके WORKSPACE
फ़ाइल में तय की जाती हैं.
Bazel के साथ बंडल किए गए वर्कस्पेस के नियमों के बारे में जानकारी, बिल्ड एनसाइक्लोपीडिया के वर्कस्पेस के नियम सेक्शन में दी गई है. साथ ही, एम्बेड किए गए Starlark रिपॉज़िटरी के नियमों के दस्तावेज़ में भी इसकी जानकारी दी गई है.
बाहरी रिपॉज़िटरी भी रिपॉज़िटरी होती हैं. इसलिए, इनमें अक्सर एक WORKSPACE
फ़ाइल भी होती है. हालांकि, Bazel इन अतिरिक्त WORKSPACE
फ़ाइलों को अनदेखा कर देता है. खास तौर पर, ट्रांज़िटिव तरीके से निर्भर रहने वाले रिपॉज़िटरी अपने-आप नहीं जुड़ते.
पैकेज
रिपॉज़िटरी में कोड संगठन की मुख्य इकाई पैकेज होती है. पैकेज, मिलती-जुलती फ़ाइलों का एक कलेक्शन होता है. साथ ही, इसमें यह जानकारी भी होती है कि आउटपुट आर्टफ़ैक्ट बनाने के लिए, इन फ़ाइलों का इस्तेमाल कैसे किया जा सकता है.
पैकेज को ऐसी डायरेक्ट्री के तौर पर परिभाषित किया जाता है जिसमें BUILD
(या BUILD.bazel
) नाम वाली फ़ाइल होती है. पैकेज में, डायरेक्ट्री में मौजूद सभी फ़ाइलें और उसके नीचे मौजूद सभी सबडायरेक्ट्री शामिल होती हैं. हालांकि, उन सबडायरेक्ट्री को शामिल नहीं किया जाता जिनमें खुद कोई 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
दस्तावेज़ देखें.