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

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

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

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

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

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

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

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

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

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

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

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

पक्का करें कि 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 बनाई जा सकती है. इसका मतलब है कि टूल और फ़ाइल का कॉन्टेंट (बिल्ड और .bzl फ़ाइलों के अलावा) का टारगेट और ऐक्शन ग्राफ़ बनाने के तरीके पर कोई असर नहीं पड़ता.

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

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

मैं Starlark कोड को कैसे डॉक्यूमेंट करूं?

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

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