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