स्क्रिप्ट से बेज़ल को कॉल कर रही हूँ

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

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

आउटपुट आधार चुनना

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

अपनी स्क्रिप्ट के लिए सही आउटपुट बेस डायरेक्ट्री चुनना कई बातों पर निर्भर करता है. अगर आपको किसी खास जगह पर बिल्ड आउटपुट डालने हैं, तो इससे ऐसे आउटपुट बेस के बारे में पता चलेगा जिसका आपको इस्तेमाल करना है. अगर आप "bazel query" को "सिर्फ़ पढ़ने के लिए" कॉल कर रहे हैं, तो लॉक करने के फ़ैक्टर ज़्यादा ज़रूरी होंगे. खास तौर पर, अगर आपको एक साथ अपनी स्क्रिप्ट के कई इंस्टेंस चलाने हैं, तो आपको हर एक को अलग (या रैंडम) आउटपुट बेस देना होगा.

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

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

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

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

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

सभी आदेशों के लिए सामान्य कोड से बाहर निकलें:

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

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

  • 34 - Google के अंदरूनी इस्तेमाल के लिए रिज़र्व है.

  • 35 - Google के अंदरूनी इस्तेमाल के लिए रिज़र्व है.

  • 36 - पर्यावरण से जुड़ी स्थानीय समस्या, ऐसा लगता है कि यह हमेशा के लिए मिट गई है.

  • 37 - बिना अनुमति के अपवाद / आंतरिक बेज़ल गड़बड़ी.

  • 38 - Google के अंदरूनी इस्तेमाल के लिए रिज़र्व है.

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

  • 41-44 - Google के अंदरूनी इस्तेमाल के लिए रिज़र्व है.

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

  • 47 - 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 ज़रूर बताएं.

प्रोफ़ाइलिंग से परफ़ॉर्मेंस का समस्या हल करना

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