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

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

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

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

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

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

Workspace

workspace, ऐसा एनवायरमेंट है जो Basel के सभी कमांड में शेयर किया जाता है. ये एक ही मुख्य रेपो से काम करते हैं. इसमें, मुख्य डेटा स्टोर करने की जगह के साथ-साथ, तय किए गए सभी बाहरी डेटा स्टोर करने की जगह भी शामिल होती है.

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

पैकेज

रिपॉज़िटरी में कोड संगठन की मुख्य इकाई पैकेज होती है. पैकेज, मिलती-जुलती फ़ाइलों का एक कलेक्शन होता है. इसमें यह जानकारी होती है कि आउटपुट वाले आर्टफ़ैक्ट बनाने के लिए उनका इस्तेमाल कैसे किया जा सकता है.

पैकेज ऐसी डायरेक्ट्री के तौर पर तय होता है जिसमें BUILD फ़ाइल होती है. इसका नाम 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 दस्तावेज़ देखें.

लेबल