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