वेंडर मोड

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

वेंडर मोड चालू करना

--vendor_dir फ़्लैग तय करके, वेंडर मोड चालू किया जा सकता है.

उदाहरण के लिए, इसे अपनी .bazelrc फ़ाइल में जोड़कर:

# Enable vendor mode with vendor directory under <workspace>/vendor_src
common --vendor_dir=vendor_src

वेंडर डायरेक्ट्री, आपके Workspace के रूट का रिलेटिव पाथ या ऐब्सलूट पाथ हो सकती है.

किसी खास बाहरी रिपॉज़िटरी को वेंडर करना

--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+ में वेंडर किया जाएगा.

दिए गए टारगेट के लिए वेंडर की बाहरी डिपेंडेंसी

दिए गए टारगेट पैटर्न बनाने के लिए, सभी बाहरी डिपेंडेंसी को वेंडर करने के लिए, 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

ध्यान दें कि सभी डिपेंडेंसी को वेंडर करने के कुछ नुकसान हैं:

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

इसलिए, सबसे पहले कुछ खास टारगेट के लिए वेंडर का इस्तेमाल करें.

VENDOR.bazel की मदद से वेंडर मोड कॉन्फ़िगर करना

वेंडर डायरेक्ट्री में मौजूद VENDOR.bazel फ़ाइल की मदद से, यह कंट्रोल किया जा सकता है कि दी गई रीपो को कैसे मैनेज किया जाए.

दो डायरेक्टिव उपलब्ध हैं. दोनों डायरेक्टिव, आर्ग्युमेंट के तौर पर कैननिकल रेपो के नामों की सूची स्वीकार करते हैं:

  • ignore(): वेंडर मोड से किसी रिपॉज़िटरी को पूरी तरह से अनदेखा करने के लिए.
  • pin(): किसी रिपॉज़िटरी को उसके मौजूदा वेंडर किए गए सोर्स पर पिन करने के लिए, जैसे कि इस रिपॉज़िटरी के लिए --override_repository फ़्लैग मौजूद है. Bazel, वेंडर कमांड चलाने के दौरान इस रेपो के लिए वेंडर किए गए सोर्स को अपडेट नहीं करेगा, जब तक कि इसे अनपिन न कर दिया जाए. उपयोगकर्ता, इस रेपो के लिए वेंडर किए गए सोर्स में मैन्युअल तरीके से बदलाव कर सकता है और उसे बनाए रख सकता है.

उदाहरण के लिए

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 मॉड्यूल रिज़ॉल्यूशन करना होता है. इसके लिए, इंटरनेट के ज़रिए रजिस्ट्री फ़ाइलों को ऐक्सेस करना पड़ सकता है. ऑफ़लाइन बिल्ड करने के लिए, Bazel, नेटवर्क से फ़ेच की गई सभी रजिस्ट्री फ़ाइलों को <vendor_dir>/_registries डायरेक्ट्री में वेंडर करता है.

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

  • <vendor_dir>/bazel-external पर एक सिमलिंक बनाएं, जो $(bazel info output_base)/external पर ले जाता हो. यह हर Bazel कमांड से अपने-आप रीफ़्रेश हो जाता है.
  • वेंडर किए गए सोर्स के लिए, उन सभी सिमलंक को फिर से लिखें जो मूल रूप से $(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 या इसके बराबर के किसी फ़ोल्डर में जोड़ने का सुझाव दिया जाता है, ताकि इसे चेक इन करने से बचा जा सके.

इस रणनीति की मदद से, वेंडर किए गए सोर्स में मौजूद सिमलंक सही तरीके से काम करने चाहिए. भले ही, वेंडर किए गए सोर्स को किसी दूसरी जगह पर ले जाया गया हो या बेज़ल आउटपुट बेस को बदल दिया गया हो.