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

समस्या की शिकायत करें सोर्स देखें Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

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

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

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