वेंडर मोड, Bzlmod की एक सुविधा है. इसकी मदद से, बाहरी डिपेंडेंसी की लोकल कॉपी बनाई जा सकती है. यह ऑफ़लाइन बिल्ड के लिए मददगार होता है. इसके अलावा, यह तब भी फ़ायदेमंद होता है, जब आपको किसी बाहरी डिपेंडेंसी के सोर्स को कंट्रोल करना हो.
वेंडर मोड चालू करें
--vendor_dir
फ़्लैग की मदद से, वेंडर मोड चालू किया जा सकता है.
उदाहरण के लिए, इसे अपनी .bazelrc
फ़ाइल में जोड़कर:
# Enable vendor mode with vendor directory under <workspace>/vendor_src
common --vendor_dir=vendor_src
वेंडर डायरेक्ट्री, आपके वर्कस्पेस रूट का रिलेटिव पाथ या एब्सोल्यूट पाथ हो सकती है.
खास बाहरी रिपॉज़िटरी (डेटा स्टोर करने की जगह) वेंडर
--repo
फ़्लैग के साथ vendor
कमांड का इस्तेमाल करके, यह तय किया जा सकता है कि किस रिपॉज़िटरी को वेंडर को भेजना है. यह कैनोनिकल रिपॉज़िटरी का नाम और सामान्य रिपॉज़िटरी का नाम, दोनों को स्वीकार करता है.
उदाहरण के लिए, चलाना:
bazel vendor --vendor_dir=vendor_src --repo=@rules_cc
या
bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc~
दोनों को <workspace root>/vendor_src/rules_cc~
के तहत वेंडर बनाने के लिए,Terms_cc मिलेगा.
दिए गए टारगेट के लिए वेंडर की बाहरी डिपेंडेंसी
दिए गए टारगेट पैटर्न बनाने के लिए ज़रूरी सभी बाहरी डिपेंडेंसी को वेंडर करने के लिए, bazel vendor <target patterns>
को चलाया जा सकता है.
उदाहरण के लिए
bazel vendor --vendor_dir=vendor_src //src/main:hello-world //src/test/...
मौजूदा कॉन्फ़िगरेशन के साथ, //src/main:hello-world
टारगेट और //src/test/...
के तहत सभी टारगेट बनाने के लिए ज़रूरी सभी रिपॉज़िटरी को वेंडर कर देगा.
हुड के तहत, यह टारगेट पैटर्न का विश्लेषण करने के लिए bazel build --nobuild
कमांड कर रहा है. इसलिए, इस कमांड पर बिल्ड फ़्लैग लागू किया जा सकता है और नतीजे पर असर पड़ सकता है.
टारगेट को ऑफ़लाइन बनाना
वेंडर की मदद से, बाहरी डिपेंडेंसी के साथ-साथ,
bazel build --vendor_dir=vendor_src //src/main:hello-world //src/test/...
बिल्ड को ऐसे साफ़ बिल्ड एनवायरमेंट में काम करना चाहिए जिसके लिए नेटवर्क ऐक्सेस और डेटा स्टोर करने की कैश मेमोरी न हो.
इसलिए, आपके पास वेंडर वाले सोर्स की जांच करके, उन्हें किसी दूसरी मशीन पर ऑफ़लाइन बनाने का विकल्प होना चाहिए.
वेंडर की सभी बाहरी डिपेंडेंसी
आपके ट्रांज़िटिव एक्सटर्नल डिपेंडेंसी ग्राफ़ में सभी डेटा स्टोर करने वाले वेंडर के लिए, ये काम किए जा सकते हैं:
bazel vendor --vendor_dir=vendor_src
ध्यान दें कि सभी डिपेंडेंसी के वेंडर के कुछ नुकसान होते हैं:
- इस तरह के सभी डेटा को फ़ेच करने में काफ़ी समय लग सकता है. इनमें वे रिपोज़ भी शामिल हैं जिन्हें एक जगह से दूसरी जगह भेजा जाता है.
- वेंडर डायरेक्ट्री बहुत बड़ी हो सकती है.
- अगर कुछ डेटा स्टोर करने की जगह, मौजूदा प्लैटफ़ॉर्म या एनवायरमेंट के साथ काम नहीं करती है, तो हो सकता है कि वे फ़ेच न हो पाएं.
इसलिए, पहले खास टारगेट के लिए वेंडरिंग का इस्तेमाल करें.
वेंडर मोड को seller.basel के साथ कॉन्फ़िगर करें
आपके पास यह कंट्रोल करने का विकल्प है कि वेंडर डायरेक्ट्री में मौजूद Seller.baकोई फ़ाइल के साथ, दिए गए रिपो को कैसे मैनेज किया जाए.
इसमें दो डायरेक्टिव उपलब्ध हैं, जिनमें से दोनों में आर्ग्युमेंट के तौर पर कैननिकल रेपो नामों की सूची को स्वीकार किया गया है:
ignore()
: वेंडर मोड से किसी रिपॉज़िटरी को पूरी तरह से अनदेखा करने के लिए.pin()
: रिपॉज़िटरी को उसके मौजूदा वेंडर सोर्स में पिन करने के लिए, जैसे कि इस रेपो के लिए--override_repository
फ़्लैग मौजूद हो. वेंडर कमांड का इस्तेमाल करते समय, Baze इस रेपो के लिए वेंडर वाले सोर्स को तब तक अपडेट नहीं करेगा, जब तक इसे अनपिन नहीं किया जाता. उपयोगकर्ता, इस रिपॉज़िटरी के लिए वेंडर के सोर्स में मैन्युअल तरीके से बदलाव कर सकता है और उसे मैनेज कर सकता है.
उदाहरण के लिए
ignore("@@rules_cc~")
pin("@@bazel_skylib~")
इस कॉन्फ़िगरेशन के साथ
- दोनों रेपो को, आने वाले वेंडर निर्देशों में शामिल नहीं किया जाएगा.
- Repo
bazel_skylib
को वेंडर डायरेक्ट्री में मौजूद सोर्स से बदल दिया जाएगा. - उपयोगकर्ता,
bazel_skylib
के वेंडर सोर्स में सुरक्षित तरीके से बदलाव कर सकता है. bazel_skylib
को फिर से भेजने के लिए, उपयोगकर्ता को पहले पिन स्टेटमेंट बंद करना होगा.
जानें कि वेंडर मोड कैसे काम करता है
Bazel, $(bazel info
output_base)/external
में मौजूद किसी प्रोजेक्ट की बाहरी डिपेंडेंसी फ़ेच करता है. एक्सटर्नल डिपेंडेंसी को वेंडर बनाने का मतलब है कि उससे जुड़ी फ़ाइलों और डायरेक्ट्री को, दिए गए वेंडर डायरेक्ट्री में ट्रांसफ़र करना और बाद के बिल्ड के लिए वेंडर किए गए सोर्स का इस्तेमाल करना.
वेंडर किए जा रहे कॉन्टेंट में ये चीज़ें शामिल हैं:
- रिपॉज़िटरी डायरेक्ट्री
- रिपॉज़िटरी मार्कर फ़ाइल
अगर किसी बिल्ड के दौरान, वेंडर की मार्कर फ़ाइल अप-टू-डेट है या रीपो को VENDOR.bazel फ़ाइल में पिन किया गया है, तो Bazel, रीपोज़िटरी नियम को चलाने के बजाय, $(bazel info output_base)/external
में इसके लिए एक सिमलिंक बनाकर, वेंडर के सोर्स का इस्तेमाल करता है. ऐसा न होने पर, चेतावनी दी जाती है और Bazel, रिपॉज़िटरी का नया वर्शन फ़ेच करने के लिए फ़ॉलबैक करेगा.
वेंडर की रजिस्ट्री फ़ाइलें
बाहरी डिपेंडेंसी फ़ेच करने के लिए, Bazel को Bazel मॉड्यूल रिज़ॉल्यूशन की प्रोसेस पूरी करनी होती है. इसके लिए, इंटरनेट के ज़रिए रजिस्ट्री फ़ाइलों को ऐक्सेस करना पड़ सकता है. ऑफ़लाइन बिल्ड
उपलब्ध कराने के लिए, Basel के वेंडर, नेटवर्क से <vendor_dir>/_registries
डायरेक्ट्री के तहत सभी रजिस्ट्री फ़ाइलों को फ़ेच करते हैं.
वेंडर के सिमलिंक
बाहरी रिपॉज़िटरी में, अन्य फ़ाइलों या डायरेक्ट्री पर ले जाने वाले सिंबललिंक हो सकते हैं. यह पक्का करने के लिए कि सिंबललिंक सही तरीके से काम करें, Bazel वेंडर के सोर्स में सिंबललिंक को फिर से लिखने के लिए, इस रणनीति का इस्तेमाल करता है:
<vendor_dir>/bazel-external
पर ले जाने वाला सिमलिंक बनाएं, जो$(bazel info output_base)/external
पर ले जाता हो. इसे हर बेज़ल कमांड से अपने-आप रीफ़्रेश किया जाता है.- वेंडर सोर्स के लिए, उन सभी सिंकलिंक को फिर से लिखें जो मूल रूप से
$(bazel info output_base)/external
के तहत मौजूद पाथ पर ले जाते हैं. इन्हें<vendor_dir>/bazel-external
के तहत मौजूद रिलेटिव पाथ पर ले जाएं.
उदाहरण के लिए, अगर ओरिजनल सिमलिंक यह है
<vendor_dir>/repo_foo~/link => $(bazel info output_base)/external/repo_bar~/file
इसे इस तरह से फिर से लिखा जाएगा
<vendor_dir>/repo_foo~/link => ../../bazel-external/repo_bar~/file
कहां
<vendor_dir>/bazel-external => $(bazel info output_base)/external # This might be new if output base is changed
<vendor_dir>/bazel-external
, Bazel की मदद से अपने-आप जनरेट होता है. इसलिए, हमारा सुझाव है कि इसे .gitignore
या इससे मिलते-जुलते फ़ंक्शन में जोड़ें, ताकि इसे चेक इन न करना पड़े.
इस रणनीति का इस्तेमाल करने पर, वेंडर वाले सोर्स में सिमलिंक सही तरीके से काम करेंगे. यह काम तब भी करना चाहिए, जब वेंडर सोर्स को किसी दूसरी जगह पर ले जाया गया हो या बेज़ल आउटपुट बेस में बदलाव हुआ हो.