यह पेज Bazel के उन उपयोगकर्ताओं के लिए है जो कस्टम बिल्ड और टेस्ट के ऐसे नियम लिखते हैं जो रिमोट प्रोग्राम के तहत, Bazel के नियमों की ज़रूरी शर्तों को समझना चाहते हैं.
रिमोट तरीके से डेटा प्रोसेस करने की सुविधा से Bazel, डेटा सेंटर जैसे किसी अलग प्लैटफ़ॉर्म पर कार्रवाइयां कर सकता है. Bazel अपने दूरस्थ निष्पादन के लिए gRPC प्रोटोकॉल का उपयोग करता है. आप bazel-buildfarm के साथ दूरस्थ निष्पादन आज़मा सकते हैं, जो कि एक ओपन-सोर्स प्रोजेक्ट है, जो वितरित दूरस्थ निष्पादन प्लैटफ़ॉर्म उपलब्ध कराता है.
अलग-अलग एनवायरमेंट टाइप या प्लैटफ़ॉर्म के बारे में जानकारी देते समय, इस पेज पर इन शब्दों का इस्तेमाल होता है:
- होस्ट प्लैटफ़ॉर्म - जहां Bazel चलता है.
- एक्ज़ीक्यूशन प्लैटफ़ॉर्म - जहां Bazel की कार्रवाइयां चलती हैं.
- टारगेट प्लैटफ़ॉर्म - जहां बिल्ड आउटपुट (और कुछ कार्रवाइयां) चलते हैं.
खास जानकारी
बेज़ल बिल्ड को रिमोट तरीके से एक्ज़ीक्यूट करने के लिए कॉन्फ़िगर करते समय, आपको इस पेज पर दिए गए दिशा-निर्देशों का पालन करना होगा. इससे यह पक्का किया जा सकेगा कि बिल्ड रिमोट तरीके से बिना किसी गड़बड़ी के काम करता है. ऐसा, रिमोट तरीके से एक्ज़ीक्यूशन की वजह से होता है, जैसे:
अलग-अलग बिल्ड कार्रवाइयां. बिल्ड टूल, स्थिति और डिपेंडेंसी को बनाए नहीं रखते हैं.
विविधता के निष्पादन वाले वातावरण. स्थानीय बिल्ड कॉन्फ़िगरेशन हमेशा रिमोट एक्ज़ीक्यूशन एनवायरमेंट के लिए सही नहीं होता है.
यह पेज उन समस्याओं के बारे में बताता है जो कस्टम बेज़ल बनाने और उन्हें लागू करने के नियमों की जांच करने के दौरान हो सकती हैं. साथ ही, इनसे बचने के तरीके भी बताए गए हैं. इसमें ये विषय शामिल हैं:
- टूलचेन नियमों के ज़रिए बिल्ड टूल का इस्तेमाल करना
- इंप्लिसिट डिपेंडेंसी मैनेज करना
- प्लैटफ़ॉर्म-आधारित बाइनरी मैनेज करना
- कॉन्फ़िगर करने के लिए सेट किए गए WORKSPACE के नियमों को मैनेज करना
टूलचेन नियमों के माध्यम से बिल्ड टूल शुरू करना
Bazel Toolchain नियम एक कॉन्फ़िगरेशन कंपनी है, जो बिल्ड नियम बताती है कि कौनसे कंपाइलर और लिंकर जैसे टूल बनाए जा सकते हैं और नियम कैसे बनाने वाले के बताए गए पैरामीटर का इस्तेमाल करके उन्हें कॉन्फ़िगर किया जा सकता है. टूलचेन नियम से बिल्ड टूल की शुरुआत और
जांच के लिए नियम बनाए जाते हैं. ये नियम पहले से कॉन्फ़िगर किए गए तरीके से मिलते हैं, जो रिमोट तरीके से
इस्तेमाल किए जा सकते हैं. उदाहरण के लिए, PATH
, JAVA_HOME
या दूसरे लोकल वैरिएबल में, बिल्ड टूल को चालू करने के बजाय,
टूलचेन नियम का इस्तेमाल करें.
हो सकता है कि ये टूल, रिमोट एक्ज़ीक्यूशन के लिए एक जैसी वैल्यू (या बिल्कुल भी) पर सेट न हों.
फ़िलहाल, शेल, रस्ट, और Go के लिए, बैजल बिल्ड और टेस्ट के नियमों पर टूलचेन के नियम लागू हैं. दूसरी भाषाओं और टूल, जैसे कि बैश के लिए, नए टूलचेन नियम लागू किए गए हैं. अगर आपके नियम में इस्तेमाल किए जाने वाले टूल के लिए टूलचेन नियम मौजूद नहीं है, तो टूलचेन नियम बनाने के बारे में सोचें.
इंप्लिसिट डिपेंडेंसी मैनेज करना
अगर कोई बिल्ड टूल पूरी तरह से बिल्ड कार्रवाइयों पर निर्भरता को ऐक्सेस कर सकता है, तो वे कार्रवाइयां दूर से एक्ज़ीक्यूट की जा सकती हैं. इसकी वजह यह है कि रिमोट बिल्ड की हर कार्रवाई दूसरे कार्रवाई से अलग तरीके से होती है. कुछ बिल्ड टूल, बिल्ड कार्रवाइयों और ऐक्सेस डिपेंडेंसी के लिए बने रहते हैं, जिन्हें टूल इनवोकेशन में साफ़ तौर पर शामिल नहीं किया गया है. इससे, तय किए गए बिल्ड ऐक्शन काम नहीं करेंगे.
उदाहरण के लिए, जब बेज़ल अपने राज्य के कंपाइलर को foo बिल्ड करने का निर्देश देता है, तब कंपाइलर, foo के बिल्ड आउटपुट का रेफ़रंस देता है. इसके बाद, जब बेज़ल कंपाइलर को बार बनाने का निर्देश देता है, जो foo पर निर्भर होता है और BUILD फ़ाइल में कंपाइलर चालू करने की कार्रवाई को शामिल करने की जानकारी साफ़ तौर पर नहीं देता है, तो ऐक्शन एक्ज़ीक्यूट हो जाता है. हालांकि, इसके लिए एक ही कंपाइलर इंस्टेंस, दोनों तरह की कार्रवाइयों के लिए लागू होता है. हालांकि, किसी रिमोट एक्ज़ीक्यूशन की स्थिति में, बिल्ड की हर कार्रवाई एक अलग कंपाइलर इंस्टेंस को चलाने के लिए, कंपाइलर स्टेट और bar का foo पर इंप्लिसिप डिपेंडेंसी खो देती है. इससे, बिल्ड काम नहीं करता.
इन सुविधाओं पर निर्भरता की समस्याओं का पता लगाने और उन्हें खत्म करने के लिए, Bazel 0.14.1 में लोकल डॉकर सैंडबॉक्स उपलब्ध है. इस डिपेंडेंसी पर, डिपेंडेंसी के लिए भी वही पाबंदियां लागू होती हैं. सैंडबॉक्स का इस्तेमाल करके, अपने बिल्ड को रिमोट एक्ज़ीक्यूशन के लिए तैयार करें. यह डिपेंडेंसी से जुड़ी बिल्ड गड़बड़ियों की पहचान करता है और उन्हें ठीक करता है. ज़्यादा जानकारी के लिए, Doker सैंडबॉक्स के साथ बेज़ल रिमोट एक्ज़ीक्यूशन से जुड़ी समस्या हल करना देखें.
प्लैटफ़ॉर्म के हिसाब से बाइनरी मैनेज करना
आम तौर पर, होस्ट प्लैटफ़ॉर्म पर बनाई गई बाइनरी फ़ाइल, एक-दूसरे से दूर रहकर काम करने वाले प्लैटफ़ॉर्म पर सुरक्षित तरीके से काम नहीं कर सकती. ऐसा किसी डिपेंडेंसी पर निर्भर होने की वजह से होता है. उदाहरण के लिए, Bazel को दिया गया सिंगलJar बाइनरी, होस्ट प्लैटफ़ॉर्म को टारगेट करता है. हालांकि, रिमोट एक्ज़ीक्यूशन के लिए, सिंगल कोड को अपना कोड बनाने की प्रोसेस के हिस्से के तौर पर कंपाइल किया जाना चाहिए, ताकि यह रिमोट एक्ज़ीक्यूशन प्लैटफ़ॉर्म को टारगेट कर सके. (टारगेट चुनने का तर्क देखें.)
अपने बिल्ड के लिए ज़रूरी बिल्ड टूल की बाइनरी को अपने सोर्स कोड के साथ न भेजें, जब तक कि आप पक्का न हो जाएं कि वे आपके एक्ज़ीक्यूशन प्लैटफ़ॉर्म पर सुरक्षित तरीके से चलेंगे. इसके बजाय, इनमें से कोई एक काम करें:
टूल के लिए सोर्स कोड को शिप करें या उसके बारे में बाहरी तौर पर बताएं, ताकि उसे रिमोट एक्ज़ीक्यूशन प्लैटफ़ॉर्म के लिए बनाया जा सके.
टूल को पहले से इंस्टॉल करके, किसी दूसरी जगह से उसे एक्ज़ीक्यूट करने के लिए उपलब्ध टूल में इंस्टॉल करें. उदाहरण के लिए, टूलचेन कंटेनर ठीक से काम न करे और अपने बिल्ड में इसे चलाने के लिए टूलचेन नियमों का इस्तेमाल करें.
कॉन्फ़िगर की जा सकने वाली WORKSPACE के नियमों को मैनेज करना
Bazel के WORKSPACE
नियमों का इस्तेमाल, बिल्ड के लिए ज़रूरी टूल और लाइब्रेरी के होस्ट प्लैटफ़ॉर्म की जांच करने के लिए किया जा सकता है. यह टूल लोकल बिल्ड के लिए, Bazel का एक्ज़ीक्यूशन प्लैटफ़ॉर्म भी है. अगर बिल्ड साफ़ तौर पर लोकल बिल्ड टूल और आर्टफ़ैक्ट के हिसाब से होता है, तो रिमोट एक्ज़ीक्यूशन के दौरान यह काम नहीं करेगा. हालांकि, अगर कोई रिमोट प्लैटफ़ॉर्म, होस्ट प्लैटफ़ॉर्म से मिलता-जुलता न हो.
WORKSPACE
नियमों के तहत ये कार्रवाइयां, रिमोट एक्ज़ीक्यूशन के साथ काम नहीं करतीं:
बाइनरी बनाना.
WORKSPACE
नियमों में कंपाइलेशन की कार्रवाइयों को एक्ज़ीक्यूट करने पर, ऐसी बाइनरी का नतीजा मिलता है जो रिमोट एक्ज़ीक्यूशन प्लैटफ़ॉर्म के साथ काम नहीं करतीं और होस्ट के प्लैटफ़ॉर्म से अलग होती हैं.pip
पैकेज इंस्टॉल किए जा रहे हैं.WORKSPACE
नियमों की मदद से इंस्टॉल किए गएpip
पैकेज के लिए, यह ज़रूरी है कि उनकी डिपेंडेंसी होस्ट प्लैटफ़ॉर्म पर पहले से इंस्टॉल हों. ऐसे पैकेज, जिन्हें खास तौर पर होस्ट प्लैटफ़ॉर्म के लिए बनाया गया है, अगर वे होस्ट प्लैटफ़ॉर्म से अलग हैं, तो वे रिमोट एक्ज़ीक्यूशन प्लैटफ़ॉर्म के साथ काम नहीं करेंगे.स्थानीय टूल या आर्टफ़ैक्ट को सिम्युलेट करना.
WORKSPACE
नियमों के ज़रिए बनाए गए होस्ट प्लैटफ़ॉर्म पर इंस्टॉल किए गए टूल या लाइब्रेरी के साथ सिंक किए जाने की वजह से, बिल्ड रिमोट कॉन्फ़िगरेशन प्लैटफ़ॉर्म पर बिल्ड के काम नहीं कर पाएगा. इसकी वजह यह है कि Bazel उन्हें ढूंढ नहीं पाएगा. इसके बजाय, स्टैंडर्ड बिल्ड ऐक्शन का इस्तेमाल करके सिमलिंक बनाएं. इससे, सिंक किए गए टूल और लाइब्रेरी को Bazel केrunfiles
ट्री से ऐक्सेस किया जा सकता है. टारगेट की गई फ़ाइलों को बाहरी रेपो डायरेक्ट्री से बाहर ले जाने के लिए,repository_ctx.symlink
का इस्तेमाल न करें.होस्ट प्लैटफ़ॉर्म को म्यूट किया जा रहा है. Bazel
runfiles
से बाहर फ़ाइलें बनाने, एनवायरमेंट वैरिएबल बनाने, और इनसे मिलती-जुलती कार्रवाइयां करने से बचें. ऐसा इसलिए, क्योंकि हो सकता है कि ये प्रोग्राम, रिमोट तरीके से एक्ज़ीक्यूशन प्लैटफ़ॉर्म पर काम न करें.
किसी काम के बिना मिलने वाले व्यवहार को ढूंढने के लिए, Workspace के नियम लॉग का इस्तेमाल करें.
अगर कोई बाहरी डिपेंडेंसी, होस्ट प्लैटफ़ॉर्म पर निर्भर कुछ खास
कार्रवाई करता है, तो आपको उन कार्रवाइयों को WORKSPACE
के बीच बांट देना चाहिए. साथ ही, नियमों को इस तरह बनाना चाहिए:
प्लैटफ़ॉर्म चेकअप और डिपेंडेंसी का आकलन. इन कार्रवाइयों को स्थानीय तौर पर लागू करने के लिए,
WORKSPACE
के नियम लागू होते हैं. इससे यह जांच की जाती है कि कौनसी लाइब्रेरी इंस्टॉल की गई हैं, कौनसे पैकेज डाउनलोड किए जाने चाहिए, और किन कंपाइलेशन को ज़रूरी बनाया जा सकता है. रिमोट तरीके से एक्ज़ीक्यूट करने के लिए, इन नियमों का इस्तेमाल करके, पहले से चेक किए गए आर्टफ़ैक्ट का इस्तेमाल किया जाना चाहिए. इससे, वह जानकारी भी मिलती है जो होस्ट प्लैटफ़ॉर्म की जांच के दौरान आम तौर पर मिल जाती है. पहले से चेक किए गए आर्टफ़ैक्ट से, बेज़ेल डिपेंडेंसी के बारे में बताते हैं, जैसे कि वे स्थानीय हैं. इसके लिए, कंडीशनल स्टेटमेंट या--override_repository
फ़्लैग का इस्तेमाल करें.किसी खास टारगेट के लिए आर्टफ़ैक्ट और प्लैटफ़ॉर्म में बदलाव करना. इन कार्रवाइयों को सामान्य बिल्ड नियमों के ज़रिए पूरा किया जाना चाहिए. बाहरी डिपेंडेंसी के लिए, खास तौर पर टारगेट के लिए आर्टफ़ैक्ट बनाने वाली कार्रवाइयां, बिल्ड के दौरान लागू होनी चाहिए.
रिमोट तरीके से एक्ज़ीक्यूट करने के लिए, पहले से जांचे गए आर्टफ़ैक्ट को आसानी से जनरेट करने के लिए,
WORKSPACE
नियमों का इस्तेमाल करके जनरेट की गई फ़ाइलें भेजी जा सकती हैं. आप हर एक्ज़ीक्यूशन के लिए इन नियमों को चला सकते हैं, जैसे कि हर टूलचेन कंटेनर के अंदर. साथ ही, रेफ़रंस के लिए अपने सोर्स रेपो में अपने रिमोट एक्ज़ीक्यूशन के आउटपुट की जांच करें.
उदाहरण के लिए, cuda
और python
के लिए Tensorflow के नियमों के लिए, WORKSPACE
के नियम ये BUILD files
बनाते हैं.
लोकल एक्ज़ीक्यूशन के लिए, होस्ट एनवायरमेंट की जांच करके बनाई गई फ़ाइलों का इस्तेमाल किया जाता है.
किसी एनवायरमेंट वैरिएबल पर शर्त स्टेटमेंट के लिए रिमोट तरीके से एक्ज़ीक्यूट करने के लिए, नियम को उन फ़ाइलों का इस्तेमाल करने की अनुमति देता है जिनकी जांच रेपो में की गई है.
BUILD
फ़ाइलों में ऐसे genrules
की जानकारी होती है जो स्थानीय तौर पर और कहीं से भी चलाई जा सकती है. साथ ही, ये दोनों ज़रूरी कार्रवाइयां भी करती हैं, जो पहले repository_ctx.symlink
से की गई थीं, जैसा कि यहां दिखाया गया है.