फ़ंक्शन

सामग्री

package

package(default_deprecation, default_package_metadata, default_testonly, default_visibility, features)

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

अगर आपको पूरे डेटाबेस के हर नियम पर लागू होने वाले मेटाडेटा के बारे में बताना है, तो अपने डेटाबेस के रूट में मौजूद REPO.bazel फ़ाइल में repo() फ़ंक्शन का इस्तेमाल करें. repo() फ़ंक्शन, package() के जैसे ही आर्ग्युमेंट स्वीकार करता है.

package() फ़ंक्शन को फ़ाइल में सबसे ऊपर मौजूद सभी load() स्टेटमेंट के ठीक बाद और किसी भी नियम से पहले कॉल किया जाना चाहिए.

तर्क

एट्रिब्यूट ब्यौरा
default_applicable_licenses

default_package_metadata का एलियास.

default_visibility

लेबल की सूची; डिफ़ॉल्ट रूप से []

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

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

default_deprecation

स्ट्रिंग; डिफ़ॉल्ट रूप से ""

इस पैकेज के सभी नियमों के लिए, डिफ़ॉल्ट deprecation मैसेज सेट करता है.

default_package_metadata

लेबल की सूची; डिफ़ॉल्ट रूप से []

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

default_testonly

बूलियन; डिफ़ॉल्ट रूप से False होता है. हालांकि, यहां बताई गई स्थितियों में इसे डिफ़ॉल्ट वैल्यू नहीं माना जाता

इस पैकेज के सभी नियमों के लिए, डिफ़ॉल्ट testonly प्रॉपर्टी सेट करता है.

javatests के तहत आने वाले पैकेज में, डिफ़ॉल्ट वैल्यू True होती है.

features

स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से []

अलग-अलग फ़्लैग सेट करता है. इनका असर, इस BUILD फ़ाइल के सिमैंटिक पर पड़ता है.

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

उदाहरण

नीचे दिए गए एलान से पता चलता है कि इस पैकेज में मौजूद नियम, सिर्फ़ //foo:target पैकेज ग्रुप के सदस्यों को दिखते हैं. अगर किसी नियम के लिए, विज़िबिलिटी के एलान मौजूद हैं, तो वे इस स्पेसिफ़िकेशन को बदल देते हैं.
package(default_visibility = ["//foo:target"])

package_group

package_group(name, packages, includes)

यह फ़ंक्शन, पैकेज का सेट तय करता है और सेट के साथ एक लेबल जोड़ता है. लेबल को visibility एट्रिब्यूट में रेफ़र किया जा सकता है.

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

किसी पैकेज को ग्रुप में तब माना जाता है, जब वह packages एट्रिब्यूट से मेल खाता हो या includes एट्रिब्यूट में बताए गए किसी अन्य पैकेज ग्रुप में पहले से शामिल हो.

पैकेज ग्रुप, तकनीकी तौर पर टारगेट होते हैं. हालांकि, इन्हें नियमों से नहीं बनाया जाता. साथ ही, इनमें विज़िबिलिटी से जुड़ी कोई सुरक्षा नहीं होती.

तर्क

एट्रिब्यूट ब्यौरा
name

नाम; ज़रूरी है

इस टारगेट के लिए यूनीक नाम.

packages

स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से []

शून्य या उससे ज़्यादा पैकेज स्पेसिफ़िकेशन की सूची.

हर पैकेज स्पेसिफ़िकेशन स्ट्रिंग का फ़ॉर्मैट इनमें से कोई एक हो सकता है: फ़ॉर्मैट:

  1. किसी पैकेज का पूरा नाम. इसमें उसका डेटाबेस शामिल नहीं होता. इसकी शुरुआत डबल स्लैश से होती है. उदाहरण के लिए, //foo/bar उस पैकेज के बारे में बताता है जिसका नाम वही है और जो पैकेज ग्रुप के डेटाबेस में मौजूद है.
  2. ऊपर की तरह, लेकिन इसके आखिर में /... होता है. उदाहरण के लिए, //foo/... , //foo और उसके सभी सबपैकेज के सेट के बारे में बताता है. //... , मौजूदा डेटाबेस में मौजूद सभी पैकेज के बारे में बताता है.
  3. `public` या `private` स्ट्रिंग. ये ` ` क्रमशः हर पैकेज या किसी भी पैकेज के बारे में नहीं बताती हैं. (इस फ़ॉर्मैट के लिए, फ़्लैग --incompatible_package_group_has_public_syntax सेट होना ज़रूरी है.)

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

पैकेज ग्रुप में ऐसा कोई भी पैकेज शामिल होता है जो उसके कम से कम एक पॉज़िटिव स्पेसिफ़िकेशन से मेल खाता हो और उसके किसी भी नेगेटिव स्पेसिफ़िकेशन से मेल न खाता हो. उदाहरण के लिए, [//foo/..., -//foo/tests/...] वैल्यू में, //foo के सभी सबपैकेज शामिल होते हैं. हालांकि, इसमें //foo/tests के सबपैकेज शामिल नहीं होते. (//foo इसमें शामिल है, लेकिन //foo/tests शामिल नहीं है.)

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

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

ध्यान दें: Bazel 6.0 से पहले, //... स्पेसिफ़िकेशन का पुराना तरीका, public के जैसा ही था. जब --incompatible_fix_package_group_reporoot_syntax चालू होता है, तो यह तरीका ठीक हो जाता है. Bazel 6.0 के बाद, यह डिफ़ॉल्ट रूप से चालू होता है.

ध्यान दें: Bazel 6.0 से पहले, जब इस एट्रिब्यूट को bazel query --output=proto (या --output=xml) के हिस्से के तौर पर क्रम से लगाया जाता है, तो शुरुआत के स्लैश हटा दिए जाते हैं. उदाहरण के लिए, //pkg/foo/... का आउटपुट \"pkg/foo/...\" होगा. जब --incompatible_package_group_includes_double_slash चालू होता है, तो यह तरीका ठीक हो जाता है. Bazel 6.0 के बाद, यह डिफ़ॉल्ट रूप से चालू होता है.

includes

लेबल की सूची; डिफ़ॉल्ट रूप से []

अन्य पैकेज ग्रुप जो इसमें शामिल हैं.

इस एट्रिब्यूट में मौजूद लेबल, अन्य पैकेज ग्रुप को रेफ़र करने चाहिए. रेफ़रंस वाले पैकेज ग्रुप में मौजूद पैकेज को, इस पैकेज ग्रुप का हिस्सा माना जाता है. यह ट्रांज़िटिव है. इसका मतलब है कि अगर पैकेज ग्रुप a में पैकेज ग्रुप b शामिल है और b में पैकेज ग्रुप c शामिल है, तो c में मौजूद हर पैकेज, a का सदस्य भी होगा.

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

उदाहरण

package_group के नीचे दिए गए एलान में, "tropical" नाम का एक पैकेज ग्रुप तय किया गया है. इसमें ट्रॉपिकल फल शामिल हैं.

package_group(
    name = "tropical",
    packages = [
        "//fruits/mango",
        "//fruits/orange",
        "//fruits/papaya/...",
    ],
)

नीचे दिए गए एलान में, किसी काल्पनिक ऐप्लिकेशन के पैकेज ग्रुप तय किए गए हैं:

package_group(
    name = "fooapp",
    includes = [
        ":controller",
        ":model",
        ":view",
    ],
)

package_group(
    name = "model",
    packages = ["//fooapp/database"],
)

package_group(
    name = "view",
    packages = [
        "//fooapp/swingui",
        "//fooapp/webui",
    ],
)

package_group(
    name = "controller",
    packages = ["//fooapp/algorithm"],
)

exports_files

exports_files([label, ...], visibility, licenses)

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

किसी पैकेज की BUILD फ़ाइल, सोर्स फ़ाइलों को सीधे तौर पर सिर्फ़ तब रेफ़र कर सकती है, जब उन्हें किसी दूसरे पैकेज से संबंधित होने पर exports_files() स्टेटमेंट के साथ साफ़ तौर पर एक्सपोर्ट किया गया हो. फ़ाइलों की विज़िबिलिटी के बारे में ज़्यादा जानें.

पुराने तरीके के मुताबिक, किसी नियम के इनपुट के तौर पर बताई गई फ़ाइलों को भी डिफ़ॉल्ट विज़िबिलिटी के साथ एक्सपोर्ट किया जाता है. ऐसा तब तक होता है, जब तक फ़्लैग --incompatible_no_implicit_file_export फ़्लिप नहीं किया जाता. हालांकि, इस तरीके पर भरोसा नहीं करना चाहिए और इससे धीरे-धीरे माइग्रेट करना चाहिए.

तर्क

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

उदाहरण

नीचे दिए गए उदाहरण में, golden.txt को test_data पैकेज की टेक्स्ट फ़ाइल के तौर पर एक्सपोर्ट किया गया है, ताकि अन्य पैकेज इसका इस्तेमाल कर सकें. उदाहरण के लिए, टेस्ट के data एट्रिब्यूट में.

# from //test_data/BUILD

exports_files(["golden.txt"])

glob

glob(include, exclude=[], exclude_directories=1, allow_empty=True)

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

अगर फ़ाइल का पैकेज के हिसाब से पाथ, include के किसी भी पैटर्न से मेल खाता है और exclude के किसी भी पैटर्न से मेल नहीं खाता है, तो सोर्स फ़ाइल का लेबल, नतीजे में शामिल किया जाता है.

include और exclude सूचियों में, मौजूदा पैकेज के हिसाब से पाथ के पैटर्न शामिल होते हैं. हर पैटर्न में, पाथ के एक या उससे ज़्यादा सेगमेंट हो सकते हैं. Unix पाथ की तरह, इन सेगमेंट को / से अलग किया जाता है. पैटर्न में मौजूद सेगमेंट, पाथ के सेगमेंट से मैच किए जाते हैं. सेगमेंट में * वाइल्डकार्ड शामिल हो सकता है. यह वाइल्डकार्ड, पाथ सेगमेंट में मौजूद किसी भी सबस्ट्रिंग (खाली सबस्ट्रिंग भी) से मैच करता है. हालांकि, यह डायरेक्ट्री सेपरेटर / से मैच नहीं करता. इस वाइल्डकार्ड का इस्तेमाल, पाथ के एक सेगमेंट में कई बार किया जा सकता है. इसके अलावा, ** वाइल्डकार्ड, पाथ के शून्य या उससे ज़्यादा सेगमेंट से मैच कर सकता है. हालांकि, इसे पाथ के अलग सेगमेंट के तौर पर तय किया जाना चाहिए.

उदाहरण:
  • foo/bar.txt , इस पैकेज में मौजूद foo/bar.txt फ़ाइल से पूरी तरह मैच करता है. हालांकि, ऐसा तब होता है, जब foo/ कोई सबपैकेज न हो
  • foo/*.txt , foo/ डायरेक्ट्री में मौजूद हर फ़ाइल से मैच करता है. हालांकि, ऐसा तब होता है, जब फ़ाइल .txt से खत्म होती हो और foo/ कोई सबपैकेज न हो
  • foo/a*.htm* , foo/ डायरेक्ट्री में मौजूद हर फ़ाइल से मैच करता है. हालांकि, ऐसा तब होता है, जब फ़ाइल a से शुरू होती हो, उसमें कोई भी स्ट्रिंग (खाली भी हो सकती है) हो, उसके बाद .htm हो, और वह किसी अन्य स्ट्रिंग से खत्म होती हो. ऐसा तब होता है, जब foo/ कोई सबपैकेज न हो. उदाहरण के लिए, foo/axx.htm और foo/a.html या foo/axxx.html
  • foo/* , foo/ डायरेक्ट्री में मौजूद हर फ़ाइल से मैच करता है. हालांकि, ऐसा तब होता है, जब foo/ कोई सबपैकेज न हो. यह foo डायरेक्ट्री से मैच नहीं करता. भले ही, exclude_directories को 0 पर सेट किया गया हो
  • foo/** , पैकेज की पहली लेवल की सबडायरेक्ट्री foo/ के तहत आने वाली हर नॉन-सबपैकेज सबडायरेक्ट्री में मौजूद हर फ़ाइल से मैच करता है. अगर exclude_directories को 0 पर सेट किया गया है, तो foo डायरेक्ट्री भी पैटर्न से मैच करती है. इस मामले में, ** को पाथ के शून्य सेगमेंट से मैच करने वाला माना जाता है
  • **/a.txt , इस पैकेज की डायरेक्ट्री के साथ-साथ, नॉन-सबपैकेज सबडायरेक्ट्री में मौजूद a.txt फ़ाइलों से मैच करता है.
  • **/bar/**/*.txt इस पैकेज की हर नॉन-सबपैकेज सबडायरेक्ट्री में मौजूद हर .txt फ़ाइल से मैच करता है. हालांकि, ऐसा तब होता है, जब नतीजे के तौर पर मिलने वाले पाथ पर कम से कम एक डायरेक्ट्री का नाम bar हो. उदाहरण के लिए, xxx/bar/yyy/zzz/a.txt या bar/a.txt (ध्यान रखें कि ** शून्य सेगमेंट से भी मैच करता है) या bar/zzz/a.txt
  • ** , इस पैकेज की हर नॉन-सबपैकेज सबडायरेक्ट्री में मौजूद हर फ़ाइल से मैच करता है
  • foo**/a.txt , अमान्य पैटर्न है. ऐसा इसलिए, क्योंकि ** को एक सेगमेंट के तौर पर अलग से तय किया जाना चाहिए
  • foo/ , अमान्य पैटर्न है. ऐसा इसलिए, क्योंकि / के बाद तय किया गया दूसरा सेगमेंट, खाली स्ट्रिंग है

अगर exclude_directories आर्ग्युमेंट चालू है (इसे 1 पर सेट किया गया है), तो नतीजों में डायरेक्ट्री टाइप की फ़ाइलें शामिल नहीं की जाएंगी. डिफ़ॉल्ट रूप से, यह 1 पर सेट होता है.

अगर allow_empty आर्ग्युमेंट को False पर सेट किया गया है, तो glob फ़ंक्शन गड़बड़ी दिखाएगा. ऐसा तब होगा, जब नतीजे के तौर पर खाली सूची मिलेगी.

इसकी कुछ अहम सीमाएं और चेतावनियां हैं:

  1. glob() , BUILD फ़ाइल के आकलन के दौरान चलता है. इसलिए, glob() सिर्फ़ आपके सोर्स ट्री में मौजूद फ़ाइलों से मैच करता है. यह जनरेट की गई फ़ाइलों से कभी मैच नहीं करता. अगर आपको ऐसा टारगेट बनाना है जिसके लिए सोर्स और जनरेट की गई, दोनों तरह की फ़ाइलों की ज़रूरत है, तो आपको glob में जनरेट की गई फ़ाइलों की साफ़ तौर पर सूची जोड़नी होगी. नीचे दिया गया उदाहरण देखें. इसमें :mylib और :gen_java_srcs का इस्तेमाल किया गया है.

  2. अगर किसी नियम का नाम, मैच की गई सोर्स फ़ाइल के नाम जैसा है, तो नियम, फ़ाइल को "शेडो" करेगा.

    इसे समझने के लिए, ध्यान रखें कि glob() पाथ की सूची दिखाता है. इसलिए, अन्य नियमों के एट्रिब्यूट में glob() का इस्तेमाल करने पर (उदाहरण के लिए, srcs = glob(["*.cc"])) , मैच किए गए पाथ को साफ़ तौर पर लिस्ट करने जैसा ही असर होता है. उदाहरण के लिए, अगर glob() , ["Foo.java", "bar/Baz.java"] दिखाता है, लेकिन पैकेज में "Foo.java" नाम का एक नियम भी है (हालांकि, Bazel इसके बारे में चेतावनी देता है), तो glob() का इस्तेमाल करने वाला व्यक्ति, "Foo.java" फ़ाइल के बजाय "Foo.java" नियम (इसके आउटपुट) का इस्तेमाल करेगा. ज़्यादा जानकारी के लिए, GitHub पर समस्या #10395 देखें.

  3. Glob, सबडायरेक्ट्री में मौजूद फ़ाइलों से मैच कर सकता है. साथ ही, सबडायरेक्ट्री के नामों में वाइल्डकार्ड का इस्तेमाल किया जा सकता है. हालांकि...
  4. लेबल को पैकेज की सीमा से बाहर इस्तेमाल नहीं किया जा सकता. साथ ही, glob, सबपैकेज में मौजूद फ़ाइलों से मैच नहीं करता.

    उदाहरण के लिए, अगर x/y , x/y/BUILD के तौर पर या पैकेज-पाथ पर कहीं और पैकेज के तौर पर मौजूद है, तो पैकेज x में**/*.cc glob एक्सप्रेशन मेंx/y/z.cc शामिल नहीं है. इसका मतलब है कि glob एक्सप्रेशन का नतीजा, BUILD फ़ाइलों के मौजूद होने पर निर्भर करता है. यानी, अगर x/y नाम का कोई पैकेज मौजूद नहीं है या उसे --deleted_packages फ़्लैग का इस्तेमाल करके, मिटाया गया है, तो वही glob एक्सप्रेशन x/y/z.cc को शामिल करेगा.

  5. ऊपर दी गई पाबंदी, सभी glob एक्सप्रेशन पर लागू होती है. भले ही, उनमें किसी भी वाइल्डकार्ड का इस्तेमाल किया गया हो.
  6. जिस फ़ाइल का नाम . से शुरू होता है उसे ** और * , दोनों वाइल्डकार्ड से पूरी तरह मैच किया जा सकता है. अगर आपको किसी छिपी हुई फ़ाइल को किसी कंपोज़िट पैटर्न से मैच करना है, तो आपका पैटर्न . से शुरू होना चाहिए. उदाहरण के लिए, * और .*.txt , .foo.txt से मैच करेंगे, लेकिन *.txt मैच नहीं करेगा. छिपी हुई डायरेक्ट्री भी इसी तरह मैच की जाती हैं. छिपी हुई डायरेक्ट्री में ऐसी फ़ाइलें शामिल हो सकती हैं जिनकी इनपुट के तौर पर ज़रूरत नहीं होती. इससे, बिना वजह glob की गई फ़ाइलों की संख्या और मेमोरी की खपत बढ़ सकती है. छिपी हुई डायरेक्ट्री को बाहर रखने के लिए, उन्हें "exclude" लिस्ट आर्ग्युमेंट में जोड़ें.
  7. "**" वाइल्डकार्ड का एक कॉर्नर केस है: पैटर्न "**" पैकेज के डायरेक्ट्री पाथ से मैच नहीं करता. इसका मतलब है कि glob(["**"], exclude_directories = 0) , मौजूदा पैकेज की डायरेक्ट्री के तहत आने वाली सभी फ़ाइलों और डायरेक्ट्री से ट्रांज़िटिव तरीके से मैच करता है. हालांकि, यह सबपैकेज की डायरेक्ट्री में नहीं जाता. इसके बारे में पिछली टिप्पणी देखें.

आम तौर पर, glob पैटर्न के लिए, सिर्फ़ '*' का इस्तेमाल करने के बजाय, सही एक्सटेंशन (उदाहरण के लिए, *.html) देने की कोशिश करनी चाहिए. साफ़ तौर पर नाम देने से, यह खुद ही दस्तावेज़ बन जाता है. साथ ही, इससे यह पक्का होता है कि आपने गलती से बैकअप फ़ाइलों या emacs/vi/... की अपने-आप सेव होने वाली फ़ाइलों को मैच नहीं किया है.

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

Glob के उदाहरण

इस डायरेक्ट्री में मौजूद सभी Java फ़ाइलों और :gen_java_srcs नियम से जनरेट की गई सभी फ़ाइलों से, Java लाइब्रेरी बनाएं.

java_library(
    name = "mylib",
    srcs = glob(["*.java"]) + [":gen_java_srcs"],
    deps = "...",
)

genrule(
    name = "gen_java_srcs",
    outs = [
        "Foo.java",
        "Bar.java",
    ],
    ...
)

testdata डायरेक्ट्री में मौजूद सभी txt फ़ाइलें शामिल करें. हालांकि, इसमें experimental.txt शामिल नहीं की जाएगी. ध्यान दें कि testdata की सबडायरेक्ट्री में मौजूद फ़ाइलें शामिल नहीं की जाएंगी. अगर आपको उन फ़ाइलों को शामिल करना है, तो रिकर्सिव glob (**) का इस्तेमाल करें.

sh_test(
    name = "mytest",
    srcs = ["mytest.sh"],
    data = glob(
        ["testdata/*.txt"],
        exclude = ["testdata/experimental.txt"],
    ),
)

रिकर्सिव Glob के उदाहरण

टेस्ट को testdata डायरेक्ट्री और उसकी किसी भी सबडायरेक्ट्री (और उनकी सबडायरेक्ट्री वगैरह) में मौजूद सभी txt फ़ाइलों पर निर्भर बनाएं. जिन सबडायरेक्ट्री में BUILD फ़ाइल मौजूद है उन्हें अनदेखा किया जाता है. (ऊपर दी गई सीमाएं और चेतावनियां देखें.)

sh_test(
    name = "mytest",
    srcs = ["mytest.sh"],
    data = glob(["testdata/**/*.txt"]),
)

इस डायरेक्ट्री और सभी सबडायरेक्ट्री में मौजूद सभी Java फ़ाइलों से एक लाइब्रेरी बनाएं. हालांकि, इसमें ऐसी सबडायरेक्ट्री शामिल नहीं की जाएंगी जिनके पाथ में testing नाम की डायरेक्ट्री शामिल है. अगर हो सके, तो इस पैटर्न का इस्तेमाल नहीं करना चाहिए. इससे बिल्ड की इंक्रीमेंटैलिटी कम हो सकती है. इसलिए, बिल्ड में लगने वाला समय बढ़ सकता है.

java_library(
    name = "mylib",
    srcs = glob(
        ["**/*.java"],
        exclude = ["**/testing/**"],
    ),
)

Glob के बड़े किए गए उदाहरण

मौजूदा डायरेक्ट्री में मौजूद *_test.cc के लिए, अलग-अलग genrule बनाएं. इससे फ़ाइल में मौजूद लाइनों की संख्या गिनी जाएगी.

# Conveniently, the build language supports list comprehensions.
[genrule(
    name = "count_lines_" + f[:-3],  # strip ".cc"
    srcs = [f],
    outs = ["%s-linecount.txt" % f[:-3]],
    cmd = "wc -l $< >$@",
 ) for f in glob(["*_test.cc"])]

अगर ऊपर दी गई BUILD फ़ाइल, //foo पैकेज में है और पैकेज में तीन मैचिंग फ़ाइलें, a_test.cc, b_test.cc, और c_test.cc मौजूद हैं, तो bazel query '//foo:all' चलाने पर, जनरेट किए गए सभी नियम दिखेंगे:

$ bazel query '//foo:all' | sort
//foo:count_lines_a_test
//foo:count_lines_b_test
//foo:count_lines_c_test

select

select(
    {conditionA: valuesA, conditionB: valuesB, ...},
    no_match_error = "custom message"
)

select() एक हेल्पर फ़ंक्शन है. इसकी मदद से, किसी नियम के एट्रिब्यूट को कॉन्फ़िगर किया जा सकता है. यह लगभग किसी भी एट्रिब्यूट असाइनमेंट के दाईं ओर मौजूद वैल्यू को बदल सकता है. इसलिए, इसकी वैल्यू, कमांड-लाइन Bazel फ़्लैग पर निर्भर करती है. उदाहरण के लिए, इसका इस्तेमाल प्लैटफ़ॉर्म के हिसाब से डिपेंडेंसी तय करने या किसी नियम को "डेवलपर" मोड के मुकाबले "रिलीज़" मोड में बनाने पर, अलग-अलग संसाधन एम्बेड करने के लिए किया जा सकता है.

इसका बुनियादी इस्तेमाल इस तरह किया जाता है:

sh_binary(
    name = "mytarget",
    srcs = select({
        ":conditionA": ["mytarget_a.sh"],
        ":conditionB": ["mytarget_b.sh"],
        "//conditions:default": ["mytarget_default.sh"]
    })
)

इससे, srcs एट्रिब्यूट को sh_binary कॉन्फ़िगर किया जा सकता है. इसके लिए, सामान्य लेबल की सूची के असाइनमेंट को select कॉल से बदलें. यह कॉल, कॉन्फ़िगरेशन की शर्तों को मैचिंग वैल्यू पर मैप करती है. हर शर्त, config_setting या constraint_value का लेबल रेफ़रंस होती है. यह तब "मैच" होती है, जब टारगेट का कॉन्फ़िगरेशन, वैल्यू के अनुमानित सेट से मैच करता है. इसके बाद, mytarget#srcs की वैल्यू, मौजूदा कॉल से मैच करने वाला कोई भी लेबल बन जाती है.

ध्यान दें:

  • किसी भी कॉल पर, सिर्फ़ एक शर्त चुनी जाती है.
  • अगर एक से ज़्यादा शर्तें मैच करती हैं और उनमें से एक, अन्य शर्तों का स्पेशलाइज़ेशन है, स्पेशलाइज़ेशन को प्राथमिकता दी जाती है. शर्त B को शर्त A का स्पेशलाइज़ेशन तब माना जाता है, जब B में वे सभी फ़्लैग और कंस्ट्रेंट वैल्यू मौजूद हों जो A में हैं. साथ ही, इसमें कुछ अतिरिक्त फ़्लैग या कंस्ट्रेंट वैल्यू भी मौजूद हों. इसका मतलब यह भी है कि स्पेशलाइज़ेशन रिज़ॉल्यूशन को ऑर्डरिंग बनाने के लिए डिज़ाइन नहीं किया गया है. इसके बारे में, नीचे दिए गए दूसरे उदाहरण में बताया गया है.
  • अगर एक से ज़्यादा शर्तें मैच करती हैं और उनमें से एक, अन्य सभी शर्तों का स्पेशलाइज़ेशन नहीं है, तो Bazel गड़बड़ी दिखाता है. हालांकि, ऐसा तब नहीं होता, जब सभी शर्तों की वैल्यू एक जैसी हो.
  • अगर कोई अन्य शर्त मैच नहीं करती है, तो //conditions:default के खास स्यूडो-लेबल को मैच करने वाला माना जाता है. अगर इस शर्त को छोड़ दिया जाता है, तो गड़बड़ी से बचने के लिए, किसी अन्य नियम को मैच करना होगा.
  • select को किसी बड़े एट्रिब्यूट असाइनमेंट के अंदर एम्बेड किया जा सकता है. इसलिए, srcs = ["common.sh"] + select({ ":conditionA": ["myrule_a.sh"], ...}) और srcs = select({ ":conditionA": ["a.sh"]}) + select({ ":conditionB": ["b.sh"]}) मान्य एक्सप्रेशन हैं.
  • select, ज़्यादातर एट्रिब्यूट के साथ काम करता है. हालांकि, यह सभी एट्रिब्यूट के साथ काम नहीं करता. असंगत एट्रिब्यूट को उनके दस्तावेज़ में nonconfigurable के तौर पर मार्क किया जाता है.

    subpackages

    subpackages(include, exclude=[], allow_empty=True)

    subpackages() , glob() की तरह एक हेल्पर फ़ंक्शन है. यह फ़ाइलों और डायरेक्ट्री के बजाय, सबपैकेज की सूची दिखाता है. यह पाथ के पैटर्न का इस्तेमाल करता है. साथ ही, यह मौजूदा समय में लोड हो रही BUILD फ़ाइल के सीधे तौर पर डिसेंडेंट वाले किसी भी सबपैकेज से मैच कर सकता है.glob() शामिल करने और बाहर रखने के पैटर्न के बारे में ज़्यादा जानकारी और उदाहरण के लिए, glob देखें.

    नतीजे के तौर पर मिलने वाली सबपैकेज की सूची, क्रम से लगाई जाती है. इसमें मौजूदा समय में लोड हो रहे पैकेज के हिसाब से पाथ शामिल होते हैं. ये पाथ, include में दिए गए पैटर्न से मैच करते हैं. हालांकि, ये exclude में दिए गए पैटर्न से मैच नहीं करते.

    उदाहरण

    नीचे दिए गए उदाहरण में, foo/BUILD पैकेज के सभी डायरेक्ट सबपैकेज की सूची दिखाई गई है

    # The following BUILD files exist:
    # foo/BUILD
    # foo/bar/baz/BUILD
    # foo/bar/but/bad/BUILD
    # foo/sub/BUILD
    # foo/sub/deeper/BUILD
    #
    # In foo/BUILD a call to
    subs1 = subpackages(include = ["**"])
    
    # results in subs1 == ["sub", "bar/baz", "bar/but/bad"]
    #
    # 'sub/deeper' is not included because it is a subpackage of 'foo/sub' not of
    # 'foo'
    
    subs2 = subpackages(include = ["bar/*"])
    # results in subs2 = ["bar/baz"]
    #
    # Since 'bar' is not a subpackage itself, this looks for any subpackages under
    # all first level subdirectories of 'bar'.
    
    subs3 = subpackages(include = ["bar/**"])
    # results in subs3 = ["bar/baz", "bar/but/bad"]
    #
    # Since bar is not a subpackage itself, this looks for any subpackages which are
    # (1) under all subdirectories of 'bar' which can be at any level, (2) not a
    # subpackage of another subpackages.
    
    subs4 = subpackages(include = ["sub"])
    subs5 = subpackages(include = ["sub/*"])
    subs6 = subpackages(include = ["sub/**"])
    # results in subs4 and subs6 being ["sub"]
    # results in subs5 = [].
    #
    # In subs4, expression "sub" checks whether 'foo/sub' is a package (i.e. is a
    # subpackage of 'foo').
    # In subs5, "sub/*" looks for subpackages under directory 'foo/sub'. Since
    # 'foo/sub' is already a subpackage itself, the subdirectories will not be
    # traversed anymore.
    # In subs6, 'foo/sub' is a subpackage itself and matches pattern "sub/**", so it
    # is returned. But the subdirectories of 'foo/sub' will not be traversed
    # anymore.
    

    आम तौर पर, यह बेहतर है कि उपयोगकर्ता इस फ़ंक्शन को सीधे तौर पर कॉल करने के बजाय कि उपयोगकर्ता skylib के 'subpackages' मॉड्यूल का इस्तेमाल करें .