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

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

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

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

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

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

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

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

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

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

सभी निर्देशों के लिए सामान्य तौर पर इस्तेमाल होने वाले कोड:

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

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

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

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

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

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

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

  • 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 का बहुत बड़ा मान तय करें.

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

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