BazelCon 2022, 16 नवंबर से 17 नवंबर तक न्यूयॉर्क में और ऑनलाइन उपलब्ध है.
आज ही रजिस्टर करें!

लेबल

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

सभी टारगेट ठीक एक पैकेज के होते हैं. टारगेट के नाम को लेबल कहा जाता है. हर लेबल, टारगेट की खास तौर पर पहचान करता है. कैननिकल फ़ॉर्म में आम तौर पर दिखने वाला लेबल ऐसा दिखता है:

@myrepo//my/app/main:app_binary

लेबल का पहला हिस्सा रिपॉज़िटरी का नाम @myrepo// है. आम तौर पर, जब लेबल उसी रिपॉज़िटरी के बारे में बताता है जिससे लेबल का इस्तेमाल किया जाता है, तो रिपॉज़िटरी आइडेंटिफ़ायर को // के तौर पर छोटा किया जा सकता है. इसलिए, @myrepo में आम तौर पर यह लेबल इस तरह लिखा जाता है

//my/app/main:app_binary

लेबल का दूसरा हिस्सा, पैकेज के नाम से मेल न खाने वाला पैकेज नाम है,my/app/mainजो रिपॉज़िटरी रूट से जुड़ा पैकेज का पाथ है. एक साथ मिलकर, रिपॉज़िटरी का नाम और बिना मंज़ूरी वाले पैकेज का नाम, पूरी तरह क्वालिफ़ाइड पैकेज नाम @myrepo//my/app/main बना देते हैं. जब लेबल उसी पैकेज का संदर्भ देता है जिसमें उसका इस्तेमाल किया गया है, तो पैकेज का नाम (और वैकल्पिक रूप से, कोलन) छोड़ा जा सकता है. इसलिए, @myrepo//my/app/main में, यह लेबल इनमें से किसी एक तरीके से लिखा जा सकता है:

app_binary
:app_binary

यह एक बात है कि फ़ाइलों के लिए कोलन को हटा दिया जाता है, लेकिन नियमों के लिए ऐसा किया जाता है, लेकिन फिर भी यह ज़रूरी नहीं है.

कोलन के बाद वाले लेबल का हिस्सा, app_binary ज़रूरी शर्तें पूरी नहीं करने वाला टारगेट नाम है. जब यह पैकेज पाथ के आखिरी कॉम्पोनेंट से मेल खाता है, तो उसे और कोलन को हटाया जा सकता है. इसलिए, ये दोनों लेबल एक जैसे हैं:

//my/app/lib
//my/app/lib:lib

पैकेज की सबडायरेक्ट्री में एक फ़ाइल टारगेट का नाम, फ़ाइल रूट की पैकेज फ़ाइल से मिलता-जुलता पाथ है. इसलिए, यह फ़ाइल रिपॉज़िटरी की my/app/main/testdata सबडायरेक्ट्री में है:

//my/app/main:testdata/input.txt

पैकेज के नाम के साथ //my/app जैसे लेबल को भ्रमित न करें. लेबल हमेशा रिपॉज़िटरी आइडेंटिफ़ायर (जिसे अक्सर छोटे नाम से जाना जाता है) से शुरू होता है. हालांकि, पैकेज के नाम कभी नहीं बताते. इसलिए, my/app में ऐसा पैकेज होता है जिसमें //my/app/lib होता है. इसे //my/app/lib:lib के तौर पर भी लिखा जा सकता है.

एक सामान्य गलतफ़हमी यह है कि //my/app का मतलब किसी पैकेज से है या किसी पैकेज के सभी टारगेट दिखाता है; दोनों ही सही नहीं है. याद रखें, यह //my/app:app के बराबर है. इसलिए, यह मौजूदा रिपॉज़िटरी के my/app पैकेज में app टारगेट को नाम देता है).

रिलेटिव लेबल का इस्तेमाल दूसरे पैकेज के टारगेट को दिखाने के लिए नहीं किया जा सकता. इस मामले में, रिपॉज़िटरी आइडेंटिफ़ायर और पैकेज के नाम की जानकारी हमेशा देनी चाहिए. उदाहरण के लिए, अगर सोर्स ट्री में पैकेज my/app और पैकेज my/app/testdata, दोनों शामिल हैं (इनमें से हर एक डायरेक्ट्री की अपनी BUILD फ़ाइल है), तो बाद वाले पैकेज में testdepot.zip नाम की एक फ़ाइल होगी. इस फ़ाइल को रेफ़र करने के लिए यहां दो तरीके (एक गलत, एक सही) दिए गए हैं //my/app:BUILD:

गलतtestdata एक अलग पैकेज है, इसलिए आप रिलेटिव पाथ का इस्तेमाल नहीं कर सकते

testdata/testdepot.zip

सही — पूरे पाथ के साथ testdata का रिफ़रेंस दें

//my/app/testdata:testdepot.zip

@// से शुरू होने वाले लेबल, मुख्य डेटा स्टोर करने की जगह के बारे में बताते हैं, जो बाहरी डेटा स्टोर करने की जगह में अब भी काम करेंगे. इसलिए, जब किसी बाहरी रिपॉज़िटरी से संपर्क किया जाता है, तो @//a/b/c उससे अलग होता है.//a/b/c. पहला, मुख्य रिपॉज़िटरी (डेटा स्टोर की जगह) पर वापस ले जाता है, जबकि बाद वाला मुख्य यूआरएल बाहरी डेटा स्टोर करने की जगह में //a/b/c को खोजता है. यह खास तौर पर, मुख्य डेटा स्टोर करने की ऐसी जगह पर नियम लिखते समय लागू होता है जो मुख्य रिपॉज़िटरी में टारगेट को टारगेट करता है. इसका इस्तेमाल बाहरी डेटा स्टोर करने की जगहों से किया जाएगा.

टारगेट करने के अलग-अलग तरीकों के बारे में जानकारी के लिए, टारगेट पैटर्न देखें.

लेबल के लेक्चर का स्टैंडर्ड

लेबल सिंटैक्स में मेटा कैरेक्टर का इस्तेमाल करने की सलाह नहीं दी जाती. इससे, कोटेशन की कोटेशन से जुड़ी समस्याओं से बचा जा सकता है. साथ ही, इससे टूल की भाषा जैसे लेबल में हेर-फेर करने वाले टूल और स्क्रिप्ट बनाना आसान हो जाता है.

स्वीकार किए गए टारगेट नामों की सटीक जानकारी नीचे दी गई है.

टारगेट के नाम — package-name:target-name

पैकेज में मौजूद टारगेट का नाम target-name है. नियम का नाम, BUILD फ़ाइल में नियम और #39; के एलान में name एट्रिब्यूट की वैल्यू है; फ़ाइल का नाम, BUILD फ़ाइल वाली डायरेक्ट्री से मिलता-जुलता पाथ है.

टारगेट नामों में पूरी तरह से a (z, AZ, 09 सेट, और विराम चिह्नों !%-@^_"#$&'()*-+,;<=>?[]{|}~/.!%-@^_"#$&'()*-+,;<=>?[]{|}~/. से लिए गए वर्ण होने चाहिए.

फ़ाइल नामों को सामान्य रूप में मिलते-जुलते पाथनाम होने चाहिए. इसका मतलब है कि उन्हें स्लैश (उदाहरण के लिए, /foo और foo/ पर पाबंदी नहीं है) से शुरू या खत्म नहीं होना चाहिए. साथ ही, उनमें पाथ को अलग करने वाले (उदाहरण के लिए, foo//bar) के तौर पर, लगातार एक से ज़्यादा स्लैश होने चाहिए. इसी तरह, अप-लेवल रेफ़रंस (..) और मौजूदा डायरेक्ट्री के रेफ़रंस (./) पर पाबंदी है.

गलत — अन्य पैकेज की फ़ाइलों को रेफ़र करने के लिए `..` का इस्तेमाल न करें

सही — `//package-name:filename` का इस्तेमाल करें

हालांकि, फ़ाइल टारगेट के नाम में / का इस्तेमाल करना आम बात है, लेकिन नियमों के नाम में / का इस्तेमाल करने से बचें. खास तौर पर, जब किसी लेबल का शॉर्टहैंड फ़ॉर्म इस्तेमाल किया जाता है, तो इससे पाठकों को भ्रम हो सकता है. //foo/bar/wiz लेबल, //foo/bar/wiz:wiz के लिए हमेशा एक शॉर्टहैंड होता है, भले ही ऐसा कोई पैकेज foo/bar/wiz न हो; यह //foo:bar/wiz का संदर्भ कभी नहीं देता, भले ही वह टारगेट मौजूद हो.

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

पैकेज के नाम — //package-name:target-name

पैकेज का नाम उस डायरेक्ट्री के नाम के साथ दिया जाता है जिसमें BUILD फ़ाइल होती है. यह नाम, रिपॉज़िटरी की टॉप-लेवल डायरेक्ट्री से मिलता-जुलता है. उदाहरण के लिए: my/app.

पैकेज के नाम, सेट के A Z, az, 09, और '/', '-', '.', '@', और '_' से शुरू हो सकते हैं.

ऐसी डायरेक्ट्री के लिए जो अपने मॉड्यूल सिस्टम (उदाहरण के लिए, Java) के लिए ज़रूरी है, उस भाषा के लिए, डायरेक्ट्री के ऐसे नाम चुनना ज़रूरी है जो उस भाषा में मान्य आइडेंटिफ़ायर हों.

हालांकि, बेज़ेल फ़ाइल फ़ोल्डर के टारगेट पैकेज में कारगर हैं (उदाहरण के लिए, //:foo), और फिर भी इस पैकेज को खाली छोड़ देना चाहिए, ताकि सभी ज़रूरी पैकेज में ज़्यादा जानकारी वाले नाम शामिल हो सकें.

पैकेज के नाम में सबस्ट्रिंग // नहीं हो सकती, न ही स्लैश के साथ खत्म हो सकता है.

नियम

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

BUILD फ़ाइलें नियम लागू करके टारगेट बताती हैं.

नीचे दिए गए उदाहरण में, हम cc_binary नियम का इस्तेमाल करके, टारगेट my_app का एलान देखते हैं.

cc_binary(
    name = "my_app",
    srcs = ["my_app.cc"],
    deps = [
        "//absl/base",
        "//absl/strings",
    ],
)

हर एक नियम के शुरू होने पर एक name एट्रिब्यूट (जो एक मान्य टारगेट नाम होना चाहिए) है, जो BUILD फ़ाइल के पैकेज में एक टारगेट बताता है.

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

कई नियमों में मौजूद srcs एट्रिब्यूट में, &colors;लेबल की सूची; कोट है; अगर मौजूद हो, तो उसका मान, लेबल की सूची होता है. हर लेबल एक टारगेट का नाम होता है, जो इस नियम का इनपुट होता है.

कुछ मामलों में, नियम किस तरह का है, यह कुछ हद तक आर्बिट्ररी है और सबसे दिलचस्प, नियम से जनरेट की गई फ़ाइलों के नाम हैं. यह नियम के दायरे में आता है. ज़्यादा जानकारी के लिए, सामान्य नियम: genrule देखें.

दूसरे मामलों में, नाम अहम होता है: उदाहरण के लिए, *_binary और *_test नियमों के लिए, बिल्ड से जनरेट किए जा सकने वाले नाम का नाम तय करता है.

टारगेट किए गए, असाइकलिक ग्राफ़ को टारगेट करने के बजाय, टारगेट ग्राफ़ या डिपेंडेंसी ग्राफ़ बनाएं नाम दिया जाता है. यह वही डोमेन होता है जिस पर बेज़ल क्वेरी टूल काम करता है.

टारगेट बिल्ड फ़ाइलें