Bazel लॉकफ़ाइल

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है किसी समस्या की शिकायत करें सोर्स देखें रात · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

लॉकफ़ाइल जनरेशन

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

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

Lockfile का इस्तेमाल

लॉकफ़ाइल को फ़्लैग से कंट्रोल किया जा सकता है --lockfile_mode से जब प्रोजेक्ट की स्थिति Lockfile. ये मोड उपलब्ध हैं:

  • update (डिफ़ॉल्ट): लॉकफ़ाइल में मौजूद जानकारी का इस्तेमाल इन कामों के लिए करें एक्सटेंशन का फिर से आकलन करने से बचने के लिए, उन रजिस्ट्री फ़ाइलों को डाउनलोड न करें जिनके बारे में पहले से जानकारी है जिनके नतीजे अब भी अप-टू-डेट हैं. अगर जानकारी मौजूद नहीं है, तो को लॉकफ़ाइल में जोड़ा जाएगा. इस मोड में, Basel को रीफ़्रेश भी नहीं किया जाता बदली जा सकने वाली जानकारी, जैसे कि यंक किए गए वर्शन. ये उन डिपेंडेंसी के लिए होते हैं जो बदल दिया गया है.
  • refresh: update की तरह, लेकिन बदली जा सकने वाली जानकारी हमेशा तब रीफ़्रेश की जाती है, जब इस मोड पर स्विच करना और इस मोड में रहते हुए करीब-करीब हर घंटे.
  • error: जैसे update, लेकिन अगर कोई जानकारी मौजूद नहीं है या पुरानी है, एक गड़बड़ी के साथ Basel का इस्तेमाल नहीं किया जा सकेगा. यह मोड लॉकफ़ाइल को कभी नहीं बदलता या रिज़ॉल्यूशन के दौरान नेटवर्क अनुरोधों का काम करता है. मार्क किए गए मॉड्यूल एक्सटेंशन reproducible खुद नेटवर्क से जुड़े अनुरोध कर सकता है. हालांकि, हमेशा समान परिणाम देने की उम्मीद की जाती है.
  • off: लॉकफ़ाइल की जांच नहीं की जाती और न ही उसे अपडेट किया जाता है.

लॉक फ़ाइल के फ़ायदे

लॉकफ़ाइल के कई फ़ायदे हैं और इसे अलग-अलग तरीकों से इस्तेमाल किया जा सकता है:

  • फिर से बनाए जा सकने वाले बिल्ड. किसी खास वर्शन या डिपेंडेंसी को कैप्चर करके को ऐक्सेस किया जा सकता है, इसलिए लॉकफ़ाइल यह पक्का करती है कि बिल्ड फिर से बनाए जा सकते हैं समय के साथ बदल सकते हैं. डेवलपर इन पर भरोसा कर सकते हैं जिससे उनके प्रोजेक्ट को बनाते समय एक जैसा और अनुमान लगाया जा सकता है.

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

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

लॉकफ़ाइल कॉन्टेंट

लॉकफ़ाइल में वह सभी ज़रूरी जानकारी शामिल होती है जो यह तय करती है कि प्रोजेक्ट की स्थिति बदल गई है. इसमें प्रोजेक्ट बनाने के नतीजे भी शामिल होते हैं स्थिति में रखें. लॉकफ़ाइल के दो मुख्य हिस्से होते हैं:

  1. सभी रिमोट फ़ाइलों के हैश, जो मॉड्यूल रिज़ॉल्यूशन के इनपुट हैं.
  2. हर मॉड्यूल के एक्सटेंशन के लिए, lockfile में ऐसे इनपुट शामिल होते हैं जो उसे प्रभावित करते हैं, bzlTransitiveDigest, usagesDigest और अन्य फ़ील्ड से दिखाया जाता है, जैसे कि एक्सटेंशन को चलाने का आउटपुट होता है, जिसे generatedRepoSpecs

यहां एक उदाहरण दिया गया है, जिसमें लॉकफ़ाइल की स्ट्रक्चर के साथ-साथ, इस बारे में भी बताया गया है हर सेक्शन के लिए एक्सप्लेनेशंस:

{
  "lockFileVersion": 10,
  "registryFileHashes": {
    "https://bcr.bazel.build/bazel_registry.json": "8a28e4af...5d5b3497",
    "https://bcr.bazel.build/modules/foo/1.0/MODULE.bazel": "7cd0312e...5c96ace2",
    "https://bcr.bazel.build/modules/foo/2.0/MODULE.bazel": "70390338... 9fc57589",
    "https://bcr.bazel.build/modules/foo/2.0/source.json": "7e3a9adf...170d94ad",
    "https://registry.mycorp.com/modules/foo/1.0/MODULE.bazel": "not found",
    ...
  },
  "selectedYankedVersions": {
    "foo@2.0": "Yanked for demo purposes"
  },
  "moduleExtensions": {
    "//:extension.bzl%lockfile_ext": {
      "general": {
        "bzlTransitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
        "usagesDigest": "aLmqbvowmHkkBPve05yyDNGN7oh7QE9kBADr3QIZTZs=",
        ...,
        "generatedRepoSpecs": {
          "hello": {
            "bzlFile": "@@//:extension.bzl",
            ...
          }
        }
      }
    },
    "//:extension.bzl%lockfile_ext2": {
      "os:macos": {
        "bzlTransitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
        "usagesDigest": "aLmqbvowmHkkBPve05y....yDNGN7oh7r3QIZTZs=",
        ...,
        "generatedRepoSpecs": {
          "hello": {
            "bzlFile": "@@//:extension.bzl",
            ...
          }
        }
      },
      "os:linux": {
        "bzlTransitiveDigest": "eWDzxG/aLsyY3Ubrto....+Jp4maQvEPxn0pLK=",
        "usagesDigest": "aLmqbvowmHkkBPve05y....yDNGN7oh7r3QIZTZs=",
        ...,
        "generatedRepoSpecs": {
          "hello": {
            "bzlFile": "@@//:extension.bzl",
            ...
          }
        }
      }
    }
  }
}

रजिस्ट्री फ़ाइल हैश

registryFileHashes सेक्शन में, इसकी सभी फ़ाइलों के हैश मौजूद होते हैं मॉड्यूल रिज़ॉल्यूशन के दौरान ऐक्सेस की गई रिमोट रजिस्ट्री. समस्या के समाधान के बाद से एक जैसे इनपुट और सभी रिमोट दिए जाने पर, एल्गोरिदम पूरी तरह से डिटर्मिनिस्टिक होता है इनपुट हैश किए जाते हैं, ताकि यह पक्का किया जा सके कि रिज़ॉल्यूशन पूरी तरह से दोबारा जनरेट हो. साथ ही, साथ ही, पक्का करें कि लॉकफ़ाइल में रिमोट जानकारी के ज़्यादा डुप्लीकेट न हों. ध्यान दें कि इसे तब भी रिकॉर्ड करने की आवश्यकता होती है जब किसी विशेष रजिस्ट्री में मॉड्यूल का उपयोग नहीं किया है, लेकिन कम प्राथमिकता वाली रजिस्ट्री में ऐसा हुआ है (इसमें "नहीं मिला" प्रविष्टि देखें) उदाहरण). इस में बदलाव करने लायक जानकारी को, इसके ज़रिए अपडेट किया जा सकता है bazel mod deps --lockfile_mode=refresh.

Baज़र, लॉकफ़ाइल में मौजूद हैश का इस्तेमाल, रिपॉज़िटरी कैश मेमोरी डाउनलोड करने से पहले समस्या हल करने के लिए किया जा सकता है.

यान वाले वर्शन के चुने गए वर्शन

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

मॉड्यूल फ़ाइलों की तुलना में, यांक किए गए वर्शन की जानकारी के मुकाबले इस फ़ील्ड की ज़रूरत है में बदलाव किया जा सकता है. इसलिए, इसे हैश से रेफ़र नहीं किया जा सकता. यह जानकारी bazel mod deps --lockfile_mode=refresh के ज़रिए अपडेट किया जा सकता है.

मॉड्यूल एक्सटेंशन

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

अगर कोई एक्सटेंशन, ऑपरेटिंग सिस्टम या आर्किटेक्चर टाइप से अलग है, तो इस सेक्शन में सिर्फ़ एक "सामान्य" एंट्री. अगर ऐसा नहीं है, तो एक से ज़्यादा इसमें ओएस, आर्किटेक्चर या दोनों के नाम पर, एंट्री के नाम शामिल होते हैं. का पालन करने के लिए डिज़ाइन किया गया है.

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

  1. bzlTransitiveDigest, एक्सटेंशन लागू करने का डाइजेस्ट होता है और इसके ज़रिए ट्रांज़िट रूप से लोड की जाने वाली .bzl फ़ाइलें.
  2. usagesDigest, YouTube में एक्सटेंशन के इस्तेमाल का डाइजेस्ट है डिपेंडेंसी ग्राफ़, जिसमें सभी टैग शामिल हैं.
  3. इसके अलावा, ऐसे फ़ील्ड जो एक्सटेंशन में अन्य इनपुट को ट्रैक करते हैं, उनके बारे में जानकारी नहीं दी गई है. जैसे, उन फ़ाइलों या डायरेक्ट्री का कॉन्टेंट जिन्हें पढ़ा जाता है या एनवायरमेंट का उपयोग करता है.
  4. generatedRepoSpecs, डेटा स्टोर करने की उन जगहों को कोड में बदल देता है जिन्हें मौजूदा इनपुट के साथ एक्सटेंशन जोड़ें.
  5. वैकल्पिक moduleExtensionMetadata फ़ील्ड में इससे मिला मेटाडेटा शामिल है जैसे कि क्या इसके द्वारा बनाए गए कुछ डेटा संग्रह स्थान रूट मॉड्यूल से use_repo के ज़रिए इंपोर्ट किया गया. इस जानकारी से, समाचार पब्लिशरों को bazel mod tidy निर्देश.

मॉड्यूल एक्सटेंशन, reproducible = True के साथ मेटाडेटा लौटाने की प्रक्रिया. ऐसा करके, वे वादा करते हैं कि एक जैसे इनपुट देने पर वे हमेशा एक ही डेटा स्टोर करने की जगह बनाएंगे.

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

लॉकफ़ाइल की सुविधा का ज़्यादा से ज़्यादा फ़ायदा पाने के लिए, इन सबसे सही तरीकों को अपनाएं तरीके:

  • प्रोजेक्ट डिपेंडेंसी में बदलाव दिखाने के लिए, lockfile को नियमित तौर पर अपडेट करें या कॉन्फ़िगरेशन. इससे यह पक्का होता है कि बाद के बिल्ड डिपेंडेंसी के अप-टू-डेट और सटीक सेट का इस्तेमाल करें. सभी एक्सटेंशन लॉक डाउन करने के लिए एक साथ bazel mod deps --lockfile_mode=update चलाएं.

  • साथ मिलकर काम करने की सुविधा देने के लिए, वर्शन कंट्रोल में लॉकफ़ाइल को शामिल करें और यह पक्का करें कि टीम के सभी सदस्यों के पास एक ही लॉकफ़ाइल का ऐक्सेस हो. पूरे प्रोजेक्ट में लगातार डेवलपमेंट एनवायरमेंट होने चाहिए.

  • Baज़र को चलाने के लिए, bazelisk का इस्तेमाल करें. साथ ही, वर्शन कंट्रोल में .bazelversion फ़ाइल, जो Basel वर्शन के बारे में बताती है लॉकफ़ाइल के हिसाब से होना चाहिए. ऐसा इसलिए, क्योंकि खुद पर बैज कंपनी की एक डिपेंडेंसी है लॉक की गई फ़ाइल, खास तौर पर Basel के वर्शन के हिसाब से है. साथ ही, पुराने सिस्टम के साथ काम करने की सुविधा के बीच भी बदलें बेज़ल रिलीज़. bazelisk का इस्तेमाल करने से यह पक्का होता है कि सभी डेवलपर इसका इस्तेमाल कर रहे हैं Basel का ऐसा वर्शन होना चाहिए जो lockfile से मेल खाता हो.

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

विरोधों को मिलाएं

Lockfile फ़ॉर्मैट को इस तरह डिज़ाइन किया गया है कि मर्ज के विरोध को कम किया जा सके. हालांकि, होता है.

स्वचालित रिज़ॉल्यूशन

Basel, गिट मर्ज ड्राइवर ताकि इन विवादों को अपने-आप हल किया जा सके.

ड्राइवर को सेट अप करने के लिए, इसके रूट में मौजूद .gitattributes फ़ाइल में यह लाइन जोड़ें आपका git रिपॉज़िटरी:

# A custom merge driver for the Bazel lockfile.
# https://bazel.build/external/lockfile#automatic-resolution
MODULE.bazel.lock merge=bazel-lockfile-merge

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

  1. jq (1.5 या उसके बाद का) इंस्टॉल करें.
  2. इन कमांड को चलाएं:
jq_script=$(curl https://raw.githubusercontent.com/bazelbuild/bazel/master/scripts/bazel-lockfile-merge.jq)
printf '%s\n' "${jq_script}" | less # to optionally inspect the jq script
git config --global merge.bazel-lockfile-merge.name   "Merge driver for the Bazel lockfile (MODULE.bazel.lock)"
git config --global merge.bazel-lockfile-merge.driver "jq -s '${jq_script}' -- %O %A %B > %A.jq_tmp && mv %A.jq_tmp %A"

मैन्युअल रिज़ॉल्यूशन

registryFileHashes और selectedYankedVersions में आसानी से मर्ज करने के विरोध फ़ील्ड के दोनों ओर से सभी प्रविष्टियां रखकर सुरक्षित रूप से रिज़ॉल्व किया जा सकता है विवाद.

अन्य तरह के मर्ज विवादों को मैन्युअल तरीके से नहीं हल करना चाहिए. इसके बजाय:

  1. लॉकफ़ाइल की पिछली स्थिति पर वापस लाएं git reset MODULE.bazel.lock && git checkout MODULE.bazel.lock के ज़रिए.
  2. MODULE.bazel फ़ाइल में मौजूद सभी विवादों का समाधान करें.
  3. लॉकफ़ाइल को अपडेट करने के लिए, bazel mod deps चलाएं.