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