अक्सर पूछे जाने वाले प्रश्न

एक्सटेंशन लिखने से जुड़ी कुछ आम समस्याएं और सवाल हैं.

मेरी फ़ाइल क्यों नहीं बनाई गई / मेरी कार्रवाई कभी नहीं की गई?

Bazel सिर्फ़ वे कार्रवाइयां करता है जो अनुरोध की गई आउटपुट फ़ाइलें बनाने के लिए ज़रूरी हैं.

  • आपको जिस फ़ाइल को जोड़ना है अगर उसमें कोई लेबल जोड़ा गया है, तो सीधे उसके लिए अनुरोध किया जा सकता है: bazel build //pkg:myfile.txt

  • अगर फ़ाइल, टारगेट के आउटपुट ग्रुप में है, तो आपको कमांड लाइन में उस आउटपुट ग्रुप के बारे में बताना पड़ सकता है: bazel build //pkg:mytarget --output_groups=foo

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

ज़्यादा जानकारी के लिए, नियम वाला पेज देखें.

मेरा लागू करने वाला फ़ंक्शन एक्ज़ीक्यूट क्यों नहीं किया गया है?

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

मेरी कार्रवाई या बाइनरी लागू होने पर कोई फ़ाइल मौजूद नहीं है

पक्का करें कि 1) फ़ाइल, कार्रवाई या बाइनरी के इनपुट के तौर पर रजिस्टर की गई हो और 2) लागू की जा रही स्क्रिप्ट या टूल, फ़ाइल को सही पाथ का इस्तेमाल करके ऐक्सेस कर रहा हो.

कार्रवाइयों के लिए, आप इनपुट को कार्रवाई बनाने वाले ctx.actions.* फ़ंक्शन में पास करके उनका एलान करते हैं. File.path का इस्तेमाल करके, फ़ाइल का सही पाथ पाया जा सकता है.

बाइनरी (bazel run या bazel test कमांड से चलाए जाने वाले एक्ज़ीक्यूटेबल आउटपुट) के लिए, आपको इनपुट के बारे में जानकारी देनी होती है. इसके लिए, उन्हें रनफ़ाइल में शामिल करना होता है. path फ़ील्ड का इस्तेमाल करने के बजाय, File.short_path का इस्तेमाल करें, जो उस फ़ाइल का पाथ है जो बाइनरी फ़ाइल की डायरेक्ट्री से जुड़ी होती है.

मैं यह कैसे कंट्रोल करूं कि bazel build //pkg:mytarget ने कौनसी फ़ाइलें बनाई हैं?

डिफ़ॉल्ट आउटपुट सेट करने के लिए, DefaultInfo की सेवा देने वाली कंपनी का इस्तेमाल करें.

मैं अपने बिल्ड के तौर पर किसी प्रोग्राम को कैसे चला सकता/सकती हूं या I/O फ़ाइल कैसे कर सकता/सकती हूं?

अपने बिल्ड के किसी दूसरे हिस्से की तरह ही, किसी टूल को टारगेट के तौर पर एलान किया जा सकता है. इसे एक्ज़ीक्यूट करने के दौरान चलाया जा सकता है, ताकि दूसरे टारगेट बनाने में मदद मिल सके. टूल चलाने वाली कार्रवाई बनाने के लिए, ctx.actions.run का इस्तेमाल करें और टूल को executable पैरामीटर के तौर पर पास करें.

लोड करने और विश्लेषण करने के दौरान, टूल नहीं चल सकता और न ही फ़ाइल I/O किया जा सकता है. इसका मतलब है कि टूल और फ़ाइल का कॉन्टेंट (BUILD और .bzl फ़ाइलों के अलावा), टारगेट और ऐक्शन ग्राफ़ के बनने के तरीके पर असर नहीं डाल सकता.

अगर मुझे लागू करने से पहले और उसके दौरान, एक ही स्ट्रक्चर्ड डेटा को ऐक्सेस करना हो, तो क्या होगा?

स्ट्रक्चर्ड डेटा को .bzl फ़ाइल के तौर पर फ़ॉर्मैट किया जा सकता है. लोड होने और विश्लेषण के चरणों के दौरान, फ़ाइल को ऐक्सेस करने के लिए, उसे load() किया जा सकता है. उन कार्रवाइयों और एक्ज़ीक्यूटेबल के लिए इनपुट या रनफ़ाइल के तौर पर इसे पास किया जा सकता है जिन्हें प्रोग्राम चलाने के दौरान इसकी ज़रूरत होती है.

मुझे Starlark कोड कैसे दिखाना चाहिए?

नियमों और नियम वाली विशेषताओं के लिए, rule या attr.*() के doc पैरामीटर में docstring की लिटरल वैल्यू (शायद तीन बार कोट की गई) पास की जा सकती है. हेल्पर फ़ंक्शन और मैक्रो के लिए, यहां दिए गए फ़ॉर्मैट के बाद, तीन कोट किए गए docstring लिटरल का इस्तेमाल करें. नियम लागू करने वाले फ़ंक्शन को आम तौर पर अपने खुद के डॉकस्ट्रिंग की ज़रूरत नहीं होती.

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