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

किसी समस्या की शिकायत करें सोर्स देखें Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

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

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

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

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

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

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

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

सभी निर्देशों के लिए सामान्य Exit Code:

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

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

  • 34 - Google के अंदर इस्तेमाल के लिए रिज़र्व किया गया.

  • 35 - Google के अंदर इस्तेमाल के लिए रिज़र्व किया गया.

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

  • 37 - Unhandled Exception / Internal Bazel Error.

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

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

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

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

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

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

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

bazel run के लिए:

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

bazel query के लिए:

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

आने वाले समय में, Bazel के वर्शन में और भी एग्ज़िट कोड जोड़े जा सकते हैं. साथ ही, गड़बड़ी के सामान्य एग्ज़िट कोड 1 को किसी ऐसी वैल्यू से बदला जा सकता है जो शून्य से अलग हो और जिसका कोई खास मतलब हो. हालांकि, शून्य से ज़्यादा की सभी वैल्यू गड़बड़ी के तौर पर दिखेंगी.

.bazelrc फ़ाइल को पढ़ना

डिफ़ॉल्ट रूप से, Basel, बुनियादी Workspace डायरेक्ट्री या उपयोगकर्ता की होम डायरेक्ट्री से .bazelrc फ़ाइल को पढ़ता है. यह आपकी स्क्रिप्ट के लिए एक विकल्प है कि आपको यह करना है या नहीं; अगर आपकी स्क्रिप्ट को पूरी तरह से हर्मेटिक (जैसे कि रिलीज़ बिल्ड करते समय) होना चाहिए, तो आपको --bazelrc=/dev/null विकल्प का इस्तेमाल करके, .bazelrc फ़ाइल को पढ़ने की सुविधा बंद करनी चाहिए. अगर आपको उपयोगकर्ता की पसंदीदा सेटिंग का इस्तेमाल करके कोई बिल्ड करना है, तो डिफ़ॉल्ट तरीके से काम करना बेहतर है.

कमांड लॉग

Bazel का आउटपुट, कमांड लॉग फ़ाइल में भी उपलब्ध होता है. इसे देखने के लिए, यह कमांड इस्तेमाल करें:

bazel info command_log

कमांड लॉग फ़ाइल में, सबसे हाल ही के Bazel कमांड की इंटरलीव की गई stdout और stderr स्ट्रीम शामिल होती हैं. ध्यान दें कि bazel info को चलाने पर, इस फ़ाइल का कॉन्टेंट बदल जाएगा, क्योंकि यह Bazel का सबसे नया निर्देश बन जाता है. हालांकि, जब तक --output_base या --output_user_root विकल्पों की सेटिंग नहीं बदली जाती, तब तक कमांड लॉग फ़ाइल की जगह नहीं बदलेगी.

पार्स किए गए डेटा का आउटपुट

Basel आउटपुट को कई कामों के लिए पार्स करना काफ़ी आसान है. आपकी स्क्रिप्ट के लिए दो विकल्प मददगार हो सकते हैं: --noshow_progress, जो प्रोग्रेस से जुड़े मैसेज को छिपाता है और --show_result n, जो यह कंट्रोल करता है कि "अप-टू-डेट" मैसेज प्रिंट किए जाएं या नहीं. इन मैसेज को पार्स किया जा सकता है, ताकि पता लगाया जा सके कि कौनसे टारगेट सफलतापूर्वक बनाए गए और उनकी बनाई गई आउटपुट फ़ाइलों की जगह. अगर आपको इन मैसेज पर भरोसा है, तो n की बहुत बड़ी वैल्यू डालना न भूलें.

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

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