स्क्रिप्ट से Bazel को कॉल किया जा रहा है

समस्या की शिकायत करें स्रोत देखें

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

आउटपुट बेस चुनना

--output_base विकल्प की मदद से यह कंट्रोल किया जाता है कि Bazel प्रोसेस, किसी बिल्ड के आउटपुट के आउटपुट के साथ-साथ, उन अलग-अलग वर्क फ़ाइलों को कहां लिखें जिन्हें Bazel ने अपने संगठन में इस्तेमाल किया है. इनमें से एक लॉक, एक लॉक है. यह कई Bazel प्रोसेस से, आउटपुट बेस को एक साथ बदले जाने से बचाता है.

अपनी स्क्रिप्ट के लिए सही आउटपुट बेस डायरेक्ट्री चुनना कई बातों पर निर्भर करता है. अगर आपको बिल्ड आउटपुट को किसी खास जगह पर रखना है, तो यह उस आउटपुट बेस को तय करेगा जिसका आपको इस्तेमाल करना है. अगर आप Bazel (जैसे कि bazel query) को "रीड ओनली" कॉल कर रहे हैं, तो लॉक करने के कारक ज़्यादा महत्वपूर्ण होंगे. खास तौर पर, अगर आपको एक साथ अपनी स्क्रिप्ट के कई इंस्टेंस चलाने हैं, तो ध्यान रखें कि Blaze सर्वर की हर प्रोसेस एक बार में ज़्यादा से ज़्यादा एक अनुरोध को हैंडल कर सकती है. आपकी स्थिति के आधार पर, हर बार आपकी स्क्रिप्ट के लिए अपनी बारी का इंतज़ार करना सही रहेगा. इसके अलावा, कई ब्लेज़ सर्वर चलाने और उनका इस्तेमाल करने के लिए --output_base का इस्तेमाल करना सही रहेगा.

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

सर्वर मोड के बारे में नोट

डिफ़ॉल्ट रूप से, Bazel ऑप्टिमाइज़ेशन के तौर पर, लंबे समय तक चलने वाली सर्वर प्रोसेस का इस्तेमाल करता है. स्क्रिप्ट में Bazel का इस्तेमाल करते समय, सर्वर का काम पूरा हो जाने पर shutdown को कॉल करना न भूलें या --max_idle_secs=5 को तय करें. इससे, सर्वर तुरंत बंद हो जाएंगे.

मुझे क्या एग्ज़िट कोड मिलेगा?

Bazel, सोर्स कोड की गड़बड़ियों का पता लगाने की कोशिश करता है. हालांकि, बाहरी गड़बड़ियों को ध्यान में रखकर, यह Bazel को सही तरीके से काम करने से रोकता है. Bazel के एक्ज़ीक्यूशन की वजह से, ये एग्ज़िट कोड मिल सकते हैं:

सभी कमांड के लिए आम तौर पर इस्तेमाल होने वाले एग्ज़िट कोड:

  • 0 - सफल
  • 2 - कमांड लाइन से जुड़ी समस्या, खराब या गैर-कानूनी फ़्लैग या कमांड कॉम्बिनेशन या खराब एनवायरमेंट वैरिएबल. आपकी कमांड लाइन में बदलाव करना ज़रूरी है.
  • 8 - बिल्ड में रुकावट आई थी, लेकिन हमने क्रम से उसे बंद कर दिया.
  • 9 - सर्वर लॉक होल्ड पर रखा गया है और --noblock_for_lock पास हो गया है.
  • 32 - इस मशीन पर बाहरी एनवायरमेंट की गड़बड़ी नहीं हुई.

  • 33 - बैजल की मेमोरी खत्म हो गई और क्रैश हो गया. आपको अपनी कमांड लाइन में बदलाव करना होगा.

  • 34 - Google के इस्तेमाल के लिए रिज़र्व है.

  • 35 - Google के इस्तेमाल के लिए रिज़र्व है.

  • 36 - स्थानीय पर्यावरण से जुड़ी समस्या, जो स्थायी हो.

  • 37 - हैंडल न किया गया अपवाद / अंदरूनी बैजल गड़बड़ी.

  • 38 - बिल्ड इवेंट सेवा में नतीजे प्रकाशित करने में अस्थायी गड़बड़ी हुई.

  • 39 - Bazel के लिए ज़रूरी Blobs को रिमोट कैश से हटा दिया गया है.

  • 41-44 - Google के इस्तेमाल के लिए रिज़र्व है.

  • 45 - बिल्ड इवेंट सेवा में नतीजे प्रकाशित करते समय लगातार गड़बड़ी होना.

  • 47 - Google के इस्तेमाल के लिए रिज़र्व है.

  • 49 - Google के इस्तेमाल के लिए रिज़र्व है.

निर्देशों bazel build, bazel test के लिए रिटर्न कोड:

  • 1 - बिल्ड नहीं किया जा सका.
  • 3 - बिल्ड ठीक है, लेकिन कुछ टेस्ट फ़ेल हो गए या उनका समय खत्म हो गया.
  • 4 - बिल्ड सफल हुआ, लेकिन टेस्टिंग का अनुरोध करने के बावजूद कोई टेस्ट नहीं मिला.

bazel run के लिए:

  • 1 - बिल्ड नहीं किया जा सका.
  • अगर बिल्ड सफल हो जाता है, लेकिन लागू किया गया सबप्रोसेस कोई गैर-शून्य एग्ज़िट कोड दिखाता है, तो यह कमांड का एग्ज़िट कोड भी होगा.

bazel query के लिए:

  • 3 - कुछ हद तक सफल, लेकिन इनपुट BUILD फ़ाइल सेट में क्वेरी के लिए एक या उससे ज़्यादा गड़बड़ियां मिली हैं. इसलिए, कार्रवाई के नतीजे 100% भरोसेमंद नहीं हैं. ऐसा कमांड लाइन पर --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 का बहुत बड़ा मान तय करना न भूलें.

प्रोफ़ाइल बनाकर परफ़ॉर्मेंस से जुड़ी समस्या हल करना

परफ़ॉर्मेंस प्रोफ़ाइलिंग सेक्शन देखें.