Basel में लॉकफ़ाइल सुविधा विशिष्ट वर्शन की रिकॉर्डिंग सक्षम करती है या किसी प्रोजेक्ट के लिए ज़रूरी सॉफ़्टवेयर लाइब्रेरी या पैकेज की डिपेंडेंसी. यह मॉड्यूल रिज़ॉल्यूशन और एक्सटेंशन के नतीजे को स्टोर करके इसे हासिल किया जाता है मूल्यांकन. लॉकफ़ाइल, फिर से बनाए जा सकने वाले बिल्ड को बढ़ावा देती है, ताकि यह पक्का किया जा सके कि डेवलपमेंट एनवायरमेंट की ज़रूरत होती है. साथ ही, यह आपके प्रॉडक्ट की परफ़ॉर्मेंस को बेहतर बनाता है, प्रोजेक्ट में कोई बदलाव न होने पर, Baze ने समाधान की प्रोसेस को स्किप कर दिया निर्भरता. इसके अलावा, लॉकफ़ाइल, फ़ाइलों को सुरक्षित रखने और उनकी अचानक होने वाले अपडेट या बाहरी लाइब्रेरी में होने वाले बदलावों से, का खतरा भी होता है.
लॉकफ़ाइल जनरेशन
लॉकफ़ाइल को फ़ाइल फ़ोल्डर के रूट में, नाम के साथ जनरेट किया जाता है
MODULE.bazel.lock
. इसे बिल्ड प्रोसेस के दौरान बनाया या अपडेट किया जाता है,
इसे खास तौर पर मॉड्यूल रिज़ॉल्यूशन और एक्सटेंशन के आकलन के बाद लागू किया जाएगा. लॉकफ़ाइल
प्रोजेक्ट की मौजूदा स्थिति को कैप्चर करता है, जिसमें MODULE फ़ाइल, फ़्लैग,
के बारे में बताया जाएगा. अहम बात यह है कि इसमें सिर्फ़
उन डिपेंडेंसी जो बिल्ड के मौजूदा इनवॉइस में शामिल होती हैं.
जब प्रोजेक्ट में ऐसे बदलाव होते हैं जो उसकी डिपेंडेंसी पर असर डालते हैं, तो lockfile नई स्थिति दिखाने के लिए अपने-आप अपडेट हो जाता है. इससे पक्का होता है कि यह मौजूदा वर्शन के लिए ज़रूरी डिपेंडेंसी के खास सेट पर फ़ोकस रहता है ताकि प्रोजेक्ट के समाधान के बारे में सटीक जानकारी दी जा सके निर्भरता.
Lockfile का इस्तेमाल
लॉकफ़ाइल को फ़्लैग से कंट्रोल किया जा सकता है
--lockfile_mode
से
जब प्रोजेक्ट की स्थिति
Lockfile. इनमें ये मोड उपलब्ध हैं:
update
(डिफ़ॉल्ट): अगर प्रोजेक्ट की स्थिति, lockfile से मेल खाती है, तो लॉकफ़ाइल से रिज़ॉल्यूशन का नतीजा तुरंत लौटा दिया जाता है. या फिर, रिज़ॉल्यूशन को एक्ज़ीक्यूट किया जाता है और लॉकफ़ाइल को मौजूदा राज्य.error
: अगर प्रोजेक्ट की स्थिति लॉकफ़ाइल से मेल खाती है, तो रिज़ॉल्यूशन का नतीजा यह होता है लॉकफ़ाइल से लौटाया गया. ऐसा नहीं होने पर, बेज़ल एक गड़बड़ी दिखाता है, जो प्रोजेक्ट और lockfile के बीच अंतर है. यह मोड खास तौर पर तब काम आता है, जब आपको यह पक्का करना हो कि आपके प्रोजेक्ट की डिपेंडेंसी और कोई भी अंतर गड़बड़ी के तौर पर गिन लिया जाता है.off
: लॉक की गई फ़ाइल की बिलकुल भी जांच नहीं की गई है.
लॉक फ़ाइल के फ़ायदे
लॉकफ़ाइल के कई फ़ायदे हैं और इसे अलग-अलग तरीकों से इस्तेमाल किया जा सकता है:
फिर से बनाए जा सकने वाले बिल्ड. किसी खास वर्शन या डिपेंडेंसी को कैप्चर करके को ऐक्सेस किया जा सकता है, इसलिए लॉकफ़ाइल यह पक्का करती है कि बिल्ड फिर से बनाए जा सकते हैं समय के साथ बदल सकते हैं. डेवलपर इन पर भरोसा कर सकते हैं जिससे उनके प्रोजेक्ट को बनाते समय एक जैसा और अनुमान लगाया जा सकता है.
समस्या को बेहतर तरीके से स्किप करना. लॉकफ़ाइल बेज़ेल को यह विकल्प देती है कि वह अगर प्रोजेक्ट डिपेंडेंसी में कोई बदलाव नहीं हुआ है, तो समाधान की प्रोसेस आखिरी बिल्ड. इससे बिल्ड की परफ़ॉर्मेंस काफ़ी बेहतर होती है. खास तौर पर, इन मामलों में ऐसे मामलों में, जहां समाधान करने में काफ़ी समय लग सकता है.
स्थिरता और जोखिम में कमी. लॉकफ़ाइल, डिवाइसों को क्रैश या फ़्रीज़ होने से बचाने में मदद करती है जो बाहरी लाइब्रेरी में अनचाहे अपडेट या ख़राब बदलावों को रोकता है. इन्होंने बदलाव किया है अलग-अलग वर्शन पर डिपेंडेंसी को लॉक करने से, गड़बड़ियां हो सकती हैं काम न करने वाले या टेस्ट नहीं किए गए अपडेट की वजह से कम हो गया है.
लॉकफ़ाइल कॉन्टेंट
लॉकफ़ाइल में वह सभी ज़रूरी जानकारी शामिल होती है जो यह तय करती है कि प्रोजेक्ट की स्थिति बदल गई है. इसमें प्रोजेक्ट बनाने के नतीजे भी शामिल होते हैं स्थिति में रखें. लॉकफ़ाइल के दो मुख्य हिस्से होते हैं:
- मॉड्यूल रिज़ॉल्यूशन के इनपुट, जैसे कि
moduleFileHash
,flags
औरlocalOverrideHashes
और साथ ही, इसका रिज़ॉल्यूशनmoduleDepGraph
. - हर मॉड्यूल के एक्सटेंशन के लिए, lockfile में ऐसे इनपुट शामिल होते हैं जो उसे प्रभावित करते हैं,
transitiveDigest
से दिखाया जाता है और उस एक्सटेंशन को चलाने से मिलने वाला आउटपुटgeneratedRepoSpecs
के तौर पर जाना जाता है
यहां एक उदाहरण दिया गया है, जिसमें लॉकफ़ाइल की स्ट्रक्चर के साथ-साथ, इस बारे में भी बताया गया है हर सेक्शन के लिए एक्सप्लेनेशंस:
{
"lockFileVersion": 1,
"moduleFileHash": "b0f47b98a67ee15f9.......8dff8721c66b721e370",
"flags": {
"cmdRegistries": [
"https://bcr.bazel.build/"
],
"cmdModuleOverrides": {},
"allowedYankedVersions": [],
"envVarAllowedYankedVersions": "",
"ignoreDevDependency": false,
"directDependenciesMode": "WARNING",
"compatibilityMode": "ERROR"
},
"localOverrideHashes": {
"bazel_tools": "b5ae1fa37632140aff8.......15c6fe84a1231d6af9"
},
"moduleDepGraph": {
"<root>": {
"name": "",
"version": "",
"executionPlatformsToRegister": [],
"toolchainsToRegister": [],
"extensionUsages": [
{
"extensionBzlFile": "extension.bzl",
"extensionName": "lockfile_ext"
}
],
...
}
},
"moduleExtensions": {
"//:extension.bzl%lockfile_ext": {
"transitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
"generatedRepoSpecs": {
"hello": {
"bzlFile": "@@//:extension.bzl",
...
}
}
}
}
}
मॉड्यूल फ़ाइल हैश
moduleFileHash
, MODULE.bazel
फ़ाइल के कॉन्टेंट का हैश दिखाता है. अगर आपने
इस फ़ाइल में कोई भी बदलाव होता है, तो हैश वैल्यू अलग-अलग होती है.
झंडे
Flags
ऑब्जेक्ट में वे सभी फ़्लैग सेव किए जाते हैं जो रिज़ॉल्यूशन के नतीजे पर असर डाल सकते हैं.
लोकल ओवरराइड हैश
अगर रूट मॉड्यूल में local_path_overrides
शामिल है, तो यह सेक्शन हैश को सेव करता है
स्थानीय डेटा संग्रह स्थान में MODULE.bazel
फ़ाइल का. इसकी मदद से, बदलावों को ट्रैक किया जा सकता है
.
मॉड्यूल डिपेंडेंसी ग्राफ़
moduleDepGraph
, इसका इस्तेमाल करके रिज़ॉल्यूशन प्रोसेस का नतीजा दिखाता है
ऊपर बताए गए इनपुट. यह सभी मॉड्यूल का डिपेंडेंसी ग्राफ़ बनाता है
प्रोजेक्ट चलाने के लिए ज़रूरी है.
मॉड्यूल एक्सटेंशन
moduleExtensions
सेक्शन एक मैप है, जिसमें सिर्फ़ इस्तेमाल किए गए एक्सटेंशन शामिल हैं
किसी एक्सटेंशन को बाहर रखते हुए, उसका मौजूदा या पहले लागू किया गया इस्तेमाल
जिनका अब इस्तेमाल नहीं किया जाता. दूसरे शब्दों में, अगर किसी एक्सटेंशन का इस्तेमाल नहीं किया जा रहा है
पूरे डिपेंडेंसी ग्राफ़ में, इसे moduleExtensions
से हटा दिया गया है
मैप.
इस मैप में हर एंट्री एक इस्तेमाल किए गए एक्सटेंशन से मेल खाती है और इसकी पहचान जिसमें फ़ाइल और नाम शामिल है. हर एंट्री से जुड़े मान में उस एक्सटेंशन से जुड़ी काम की जानकारी:
transitiveDigest
एक्सटेंशन को लागू करने का डाइजेस्ट और इसके .bzl फ़ाइलें.generatedRepoSpecs
उस एक्सटेंशन को मौजूदा इनपुट.
एक्सटेंशन के नतीजों पर असर डालने का एक और तरीका है, उनका इस्तेमाल. हालांकि, इसे लॉकफ़ाइल में सेव नहीं किया जाता, लेकिन तुलना करते समय इस्तेमाल पर ध्यान दिया जाता है लॉकफ़ाइल में मौजूद एक्सटेंशन के साथ एक्सटेंशन की मौजूदा स्थिति.
सबसे सही तरीके
लॉकफ़ाइल की सुविधा का ज़्यादा से ज़्यादा फ़ायदा पाने के लिए, इन सबसे सही तरीकों को अपनाएं तरीके:
प्रोजेक्ट डिपेंडेंसी में बदलाव दिखाने के लिए, lockfile को नियमित तौर पर अपडेट करें या कॉन्फ़िगरेशन. इससे यह पक्का होता है कि बाद के बिल्ड डिपेंडेंसी के अप-टू-डेट और सटीक सेट का इस्तेमाल करें.
साथ मिलकर काम करने की सुविधा देने के लिए, वर्शन कंट्रोल में लॉकफ़ाइल को शामिल करें और यह पक्का करें कि टीम के सभी सदस्यों के पास एक ही लॉकफ़ाइल का ऐक्सेस हो. पूरे प्रोजेक्ट में एक जैसा डेवलपमेंट एनवायरमेंट होने चाहिए.
इन सबसे सही तरीकों को अपनाकर, अपने ऐप्लिकेशन में बेज़ेल की नई सुविधा से, लोगों को बेहतर, भरोसेमंद, और, बेहतर तरीके से साथ मिलकर काम करने में मदद मिली है सॉफ़्टवेयर डेवलपमेंट वर्कफ़्लो.