राइटिंग एक्सटेंशन से जुड़ी कुछ सामान्य समस्याएं और सवाल यहां दिए गए हैं.
मेरी फ़ाइल क्यों नहीं बनाई गई / मेरी कार्रवाई कभी पूरी क्यों नहीं हुई?
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 कमांड से चलने वाले एक्ज़ीक्यूटेबल आउटपुट) के लिए, इनपुट का एलान runfiles में शामिल करके किया जाता है. 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 लिटरल (ट्रिपल कोट किया गया) पास किया जा सकता है. सहायता करने वाले फ़ंक्शन और मैक्रो के लिए, तीन कोटेशन वाले डॉकस्ट्रिंग लिटरल का इस्तेमाल करें. इसके लिए, यहां दिए गए फ़ॉर्मैट का इस्तेमाल करें.
नियम लागू करने वाले फ़ंक्शन के लिए, आम तौर पर अपने डॉकस्ट्रिंग की ज़रूरत नहीं होती.
स्ट्रिंग लिटरल का इस्तेमाल सही जगहों पर करने से, ऑटोमेटेड टूलिंग के लिए दस्तावेज़ को निकालना आसान हो जाता है. जहां भी आपके कोड को पढ़ने वाले व्यक्ति के लिए मददगार हो वहां स्टैंडर्ड नॉन-स्ट्रिंग टिप्पणियों का इस्तेमाल करें.