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

किसको दिखाई दे

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

इस पेज पर, विज्ञापन दिखने की जानकारी से जुड़े निर्देश, सबसे सही तरीके, और उदाहरण दिए गए हैं.

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

अगर आप 'किसको दिखाई दे' जांच की सुविधा बंद करना चाहते हैं (जैसे कि प्रयोग करने के दौरान), तो --check_visibility=false का इस्तेमाल करें.

पैकेज और सबपैकेज के बारे में ज़्यादा जानकारी पाने के लिए, कॉन्सेप्ट और शब्दावली देखें.

दृश् यता विवरण

सभी नियम टारगेट में visibility एट्रिब्यूट है, जो लेबल की सूची लेता है. अगर किसी टारगेट को एक ही पैकेज में रखा गया है या उन्हें किसी एक लेबल के आधार पर दिखाया जाता है, तो दूसरे लोगों को भी एक टारगेट दिखेगा.

हर लेबल का इनमें से कोई एक फ़ॉर्म होता है:

  • "//visibility:public": इस टारगेट का इस्तेमाल कोई भी कर सकता है. (किसी दूसरी खास जानकारी के साथ जोड़ा नहीं जा सकता.)

  • "//visibility:private": केवल इस पैकेज के लक्ष्य इस लक्ष्य का उपयोग कर सकते हैं. (किसी दूसरी खास जानकारी के साथ जोड़ा नहीं जा सकता.)

  • "//foo/bar:__pkg__": //foo/bar में बताए गए टारगेट का ऐक्सेस देता है (लेकिन, इसके सबपैकेज नहीं). यहां, __pkg__ सिंटैक्स का एक खास हिस्सा है, जो किसी पैकेज में सभी टारगेट को दिखाता है.

  • "//foo/bar:__subpackages__": //foo/bar में बताए गए टारगेट या इसके सीधे तौर पर या किसी दूसरे सब-पैकेज पर ऐक्सेस देता है. ध्यान रखें कि __subpackages__ खास सिंटैक्स है.

  • "//foo/bar:my_package_group": दिए गए पैकेज ग्रुप के नाम से सभी पैकेज को ऐक्सेस देता है.

    • पैकेज ग्रुप खास __pkg__ और __subpackages__ सिंटैक्स के साथ काम नहीं करते. पैकेज ग्रुप में, "//foo/bar", "//foo/bar:__pkg__" के बराबर होता है और "//foo/bar/...", "//foo/bar:__subpackages__" के बराबर होता है.

उदाहरण के लिए, अगर //some/package:mytarget का visibility [":__subpackages__", "//tests:__pkg__"] पर सेट है, तो इसका इस्तेमाल ऐसे किसी भी टारगेट के लिए किया जा सकता है जो //some/package/... सोर्स ट्री का हिस्सा हो. साथ ही, टारगेट //tests/BUILD में तय किए गए हैं, लेकिन //tests/integration/BUILD में तय किए गए टारगेट के मुताबिक नहीं.

खास बात के तौर पर, package_group टारगेट में खुद का visibility एट्रिब्यूट नहीं होता है; वे हमेशा सार्वजनिक रूप से दृश्यमान होते हैं.

दृश्यता को गैर-package_group टारगेट पर सेट नहीं किया जा सकता. इससे एक "लेबल पैकेज ग्रुप नहीं दिखाता है" या "डिपेंडेंसी ग्राफ़ में साइकल" गड़बड़ी ट्रिगर होती है.

नियम टारगेट की दृश्यता

अगर कोई नियम टारगेट visibility विशेषता सेट नहीं करता है, तो इसके दिखाई देने की जानकारी default_visibility के ज़रिए दी जाती है जो package टारगेट की बिल्ड फ़ाइल का स्टेटमेंट. अगर ऐसा कोई default_visibility एलान नहीं है, तो यह जानकारी //visibility:private है.

config_setting दिखने की सुविधा अब तक लागू नहीं हुई है. --incompatible_enforce_config_setting_visibility और --incompatible_config_setting_private_default_visibility दूसरे नियमों के साथ जुड़ने के लिए माइग्रेशन तर्क देते हैं.

अगर --incompatible_enforce_config_setting_visibility=false है, तो सभी config_setting टारगेट को बिना किसी शर्त के दिखाई देगा.

अगर --incompatible_config_setting_private_default_visibility=false है, तो कोई भी config_setting, जो साफ़ तौर पर सेट नहीं करता है, //visibility:public है (पैकेज default_visibility को अनदेखा करते हुए).

अगर --incompatible_config_setting_private_default_visibility=true, config_setting है, तो दूसरे सभी नियमों के हिसाब से दिखने वाले तर्क का इस्तेमाल करें.

सबसे सही तरीका यह है कि सभी config_setting टारगेट का इस्तेमाल अन्य नियमों की तरह किया जाए: खास तौर पर, visibility को उस पैकेज के बाहर कहीं भी इस्तेमाल किए जाने वाले किसी भी config_setting पर सेट करें.

उदाहरण

फ़ाइल //frobber/bin/BUILD:

# This target is visible to everyone
cc_binary(
    name = "executable",
    visibility = ["//visibility:public"],
    deps = [":library"],
)

# This target is visible only to targets declared in the same package
cc_library(
    name = "library",
    # No visibility -- defaults to private since no
    # package(default_visibility = ...) was used.
)

# This target is visible to targets in package //object and //noun
cc_library(
    name = "subject",
    visibility = [
        "//noun:__pkg__",
        "//object:__pkg__",
    ],
)

# See package group "//frobber:friends" (below) for who can
# access this target.
cc_library(
    name = "thingy",
    visibility = ["//frobber:friends"],
)

फ़ाइल //frobber/BUILD:

# This is the package group declaration to which target
# //frobber/bin:thingy refers.
#
# Our friends are packages //frobber, //fribber and any
# subpackage of //fribber.
package_group(
    name = "friends",
    packages = [
        "//fribber/...",
        "//frobber",
    ],
)

जनरेट किए गए फ़ाइल टारगेट की दृश्यता

जनरेट किए गए फ़ाइल टारगेट की नियम वही है जो नियम टारगेट के ज़रिए जनरेट होती है.

स्रोत फ़ाइल टारगेट की दृश्यता

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

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

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

उदाहरण

फ़ाइल //frobber/data/BUILD:

exports_files(["readme.txt"])

फ़ाइल //frobber/bin/BUILD:

cc_binary(
  name = "my-program",
  data = ["//frobber/data:readme.txt"],
)

विरासती व्यवहार

अगर फ़्लैग --incompatible_no_implicit_file_export सेट नहीं है, तो पुराना तरीका लागू होगा.

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

zl फ़ाइलों की निजता सेटिंग

फ़िलहाल, load स्टेटमेंट पर कुछ नहीं लिखा जा सकता. फ़ाइल फ़ोल्डर में कहीं भी bzl फ़ाइल लोड करना संभव है.

हालांकि, उपयोगकर्ता बिल्डिफ़ायर लीटर चलाने का विकल्प चुन सकते हैं. ऐप्लिकेशन केBzl-किसको दिखाई दे चेक उपयोगकर्ता को चेतावनी देता हैload नीचे दी गई सबडायरेक्ट्री के नीचे सेinternal याprivate चुनें.

डिपेंडेंसी पर नज़र रखना

कुछ नियमों में डिपेंडेंसी शामिल होती है. उदाहरण के लिए, हो सकता है कि C++ नियम साफ़ तौर पर C++ कंपाइलर पर निर्भर करे.

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

सबसे सही तरीके

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

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

  • टारगेट को बंद करते समय, सटीक जानकारी देने वाले निर्देशों का इस्तेमाल करें. नई डिपेंडेंसी से बचने के लिए, मौजूदा उपयोगकर्ताओं को दिखने से रोकें.