स्क्रिप्ट से Bazel को कॉल किया जा सकता है, ताकि बिल्ड किया जा सके, टेस्ट चलाए जा सकें या डिपेंडेंसी ग्राफ़ के बारे में क्वेरी की जा सके. Bazel को असरदार स्क्रिप्टिंग के लिए डिज़ाइन किया गया है. हालांकि, इस सेक्शन में कुछ ऐसी जानकारी दी गई है जिसे ध्यान में रखकर, अपनी स्क्रिप्ट को ज़्यादा मज़बूत बनाया जा सकता है.
आउटपुट बेस चुनना
--output_base विकल्प से यह कंट्रोल किया जाता है कि Bazel प्रोसेस, बिल्ड के आउटपुट को कहां लिखेगी. साथ ही, Bazel की ओर से अंदरूनी तौर पर इस्तेमाल की जाने वाली अलग-अलग वर्किंग फ़ाइलों को भी कंट्रोल किया जाता है. इनमें से एक लॉक है, जो कई Bazel प्रोसेस की ओर से आउटपुट बेस में एक साथ बदलाव करने से बचाता है.
अपनी स्क्रिप्ट के लिए सही आउटपुट बेस डायरेक्ट्री चुनने के लिए, कई बातों का ध्यान रखना होता है. अगर आपको बिल्ड आउटपुट को किसी खास जगह पर रखना है, तो इससे यह तय होगा कि आपको किस आउटपुट बेस का इस्तेमाल करना है. अगर Bazel को "सिर्फ़ पढ़ने" का अनुरोध किया जा रहा है (जैसे कि bazel query), तो लॉकिंग फ़ैक्टर ज़्यादा अहम होंगे. खास तौर पर, अगर आपको अपनी स्क्रिप्ट के कई इंस्टेंस एक साथ चलाने हैं, तो आपको हर इंस्टेंस को अलग (या रैंडम) आउटपुट बेस देना होगा.
डिफ़ॉल्ट आउटपुट बेस वैल्यू का इस्तेमाल करने पर, आपको उसी लॉक के लिए प्रतिस्पर्धा करनी होगी जिसका इस्तेमाल उपयोगकर्ता की इंटरैक्टिव Bazel कमांड करती हैं. अगर उपयोगकर्ता, लंबे समय तक चलने वाले निर्देश देता है, जैसे कि बिल्ड, तो आपकी स्क्रिप्ट को उन निर्देशों के पूरा होने का इंतज़ार करना होगा. इसके बाद ही, वह आगे बढ़ पाएगी.
सर्वर मोड के बारे में नोट
डिफ़ॉल्ट रूप से, Bazel ऑप्टिमाइज़ेशन के तौर पर लंबे समय तक चलने वाली सर्वर प्रोसेस का इस्तेमाल करता है. स्क्रिप्ट में Bazel चलाते समय, सर्वर का काम पूरा होने पर shutdown को कॉल करना न भूलें. इसके अलावा, --max_idle_secs=5 को भी कॉल करें, ताकि
निष्क्रिय सर्वर तुरंत बंद हो जाएं.
मुझे कौन-सा एग्ज़िट कोड मिलेगा?
Bazel, सोर्स कोड की वजह से होने वाली गड़बड़ियों को अलग करने की कोशिश करता है. साथ ही, Bazel को ठीक से काम करने से रोकने वाली बाहरी गड़बड़ियों को भी अलग करने की कोशिश करता है. Bazel को चलाने पर, ये एक्ज़िट कोड मिल सकते हैं:
सभी कमांड के लिए सामान्य एग्ज़िट कोड:
0- Success2- कमांड लाइन से जुड़ी समस्या, गलत या गैर-कानूनी फ़्लैग या कमांड कॉम्बिनेशन या गलत एनवायरमेंट वैरिएबल. आपको अपनी कमांड लाइन में बदलाव करना होगा.8- बिल्ड में रुकावट आई, लेकिन हमने इसे बंद कर दिया है.9- सर्वर लॉक चालू है और--noblock_for_lockकी जांच पास हो गई है.32- External Environment Failure not on this machine.33- Bazel की मेमोरी खत्म हो गई है और यह क्रैश हो गया है. आपको अपनी कमांड लाइन में बदलाव करना होगा.34- इसे Google के इंटरनल इस्तेमाल के लिए रिज़र्व किया गया है.35- इसे Google के इंटरनल इस्तेमाल के लिए रिज़र्व किया गया है.36- स्थानीय पर्यावरण से जुड़ी समस्या, जिसके ठीक होने की संभावना नहीं है.37- Unhandled Exception / Internal Bazel Error.38- इसे Google के इंटरनल इस्तेमाल के लिए रिज़र्व किया गया है.39- Bazel के लिए ज़रूरी ब्लॉब, रिमोट कैश से हटा दिए जाते हैं.41-44- इसे Google के इंटरनल इस्तेमाल के लिए रिज़र्व किया गया है.45- Build Event Service में नतीजे पब्लिश करने में गड़बड़ी हुई.47- इसे Google के इंटरनल इस्तेमाल के लिए रिज़र्व किया गया है.
कमांड bazel build, bazel test के लिए रिटर्न कोड:
1- बिल्ड नहीं किया जा सका.3- बिल्ड ठीक है, लेकिन कुछ टेस्ट फ़ेल हो गए हैं या उनकी समयसीमा खत्म हो गई है.4- बिल्ड सही तरीके से बन गया है, लेकिन कोई टेस्ट नहीं मिला. हालांकि, टेस्ट करने का अनुरोध किया गया था.
bazel run के लिए:
1- बिल्ड नहीं किया जा सका.- अगर बिल्ड पूरा हो जाता है, लेकिन एक्ज़ीक्यूट की गई सबप्रोसेस, शून्य से अलग एक्ज़िट कोड दिखाती है, तो यह कमांड का एक्ज़िट कोड भी होगा.
bazel query के लिए:
3- कुछ हद तक सही नतीजे मिले हैं, लेकिन इनपुट BUILD फ़ाइल सेट में क्वेरी को एक या उससे ज़्यादा गड़बड़ियां मिली हैं. इसलिए, ऑपरेशन के नतीजे पूरी तरह से भरोसेमंद नहीं हैं. ऐसा कमांड लाइन पर मौजूद--keep_goingविकल्प की वजह से हो सकता है.7- कमांड पूरी नहीं हो सकी.
Bazel के आने वाले वर्शन में, अतिरिक्त एग्ज़िट कोड जोड़े जा सकते हैं. ये कोड, सामान्य गड़बड़ी वाले एग्ज़िट कोड 1 को किसी अन्य नॉन-ज़ीरो वैल्यू से बदल सकते हैं. इस वैल्यू का कोई खास मतलब होगा.
हालांकि, शून्य से अलग सभी एक्ज़िट वैल्यू को हमेशा गड़बड़ी माना जाएगा.
.bazelrc फ़ाइल को पढ़ना
डिफ़ॉल्ट रूप से, Bazel .bazelrc फ़ाइल को बेस वर्कस्पेस डायरेक्ट्री या उपयोगकर्ता की होम डायरेक्ट्री से पढ़ता है. यह आपकी स्क्रिप्ट पर निर्भर करता है कि आपको इस सुविधा का इस्तेमाल करना है या नहीं. अगर आपकी स्क्रिप्ट को पूरी तरह से हर्मेटिक (जैसे, रिलीज़ बिल्ड बनाते समय) होना चाहिए, तो आपको --bazelrc=/dev/null विकल्प का इस्तेमाल करके, .bazelrc फ़ाइल को पढ़ने की सुविधा बंद करनी चाहिए. अगर आपको उपयोगकर्ता की पसंदीदा सेटिंग का इस्तेमाल करके बिल्ड करना है, तो डिफ़ॉल्ट सेटिंग बेहतर होती है.
कमांड लॉग
Bazel का आउटपुट, कमांड लॉग फ़ाइल में भी उपलब्ध होता है. इसे इस कमांड की मदद से ढूंढा जा सकता है:
bazel info command_logकमांड लॉग फ़ाइल में, Bazel की सबसे हाल की कमांड के इंटरलीव किए गए stdout और stderr स्ट्रीम शामिल होते हैं. ध्यान दें कि bazel info चलाने पर, इस फ़ाइल का कॉन्टेंट बदल जाएगा. ऐसा इसलिए होगा, क्योंकि यह Bazel का सबसे नया निर्देश बन जाएगा.
हालांकि, कमांड लॉग फ़ाइल की जगह तब तक नहीं बदलेगी, जब तक --output_base या --output_user_root विकल्पों की सेटिंग नहीं बदली जाती.
पार्स करने का आउटपुट
Bazel के आउटपुट को कई कामों के लिए पार्स करना बहुत आसान होता है. आपकी स्क्रिप्ट के लिए दो विकल्प मददगार हो सकते हैं. पहला, --noshow_progress, जो प्रोग्रेस मैसेज को छिपाता है. दूसरा, --show_result n, जो यह कंट्रोल करता है कि "अप-टू-डेट बनाएं" मैसेज प्रिंट किए जाएं या नहीं. इन मैसेज को पार्स करके यह पता लगाया जा सकता है कि कौनसे टारगेट सफलतापूर्वक बनाए गए थे और उन्होंने आउटपुट फ़ाइलें कहां बनाई थीं. अगर आपको इन मैसेज पर भरोसा है, तो n की बहुत बड़ी वैल्यू डालें.
प्रोफ़ाइलिंग करके परफ़ॉर्मेंस से जुड़ी समस्याओं को हल करना
परफ़ॉर्मेंस प्रोफ़ाइलिंग सेक्शन देखें.