BazelCon 2022, 16 नवंबर से 17 नवंबर तक न्यूयॉर्क में और ऑनलाइन उपलब्ध है.
आज ही रजिस्टर करें!

आर्ग

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.
ऐसा ऑब्जेक्ट जो याद रखने के लिए, स्टोरेज की ज़रूरत को पूरा करता है. इस तरह के डेटा में, कमांड लाइन का कुछ हिस्सा या पूरी लाइन बनाने के लिए, डेटा की ज़रूरत होती है.

ऐसा अक्सर होता है कि किसी कार्रवाई के लिए बड़ी कमांड लाइन की ज़रूरत होती है. इसमें ट्रांज़िटिव डिपेंडेंसी से इकट्ठा की गई वैल्यू होती हैं. उदाहरण के लिए, लिंकर कमांड लाइन, लिंक की जा रही सभी लाइब्रेरी के लिए ज़रूरी ऑब्जेक्ट ऑब्जेक्ट की सूची बना सकती है. इस तरह के ट्रांज़िटिव डेटा को depset में सेव करना सबसे सही तरीका है, ताकि इसे कई टारगेट के ज़रिए शेयर किया जा सके. हालांकि, अगर नियम लेखक को कार्रवाई कमांड लाइन बनाने के लिए, इन डिसेट को स्ट्रिंग की सूची में बदलना था, तो यह मेमोरी शेयर करने के ऑप्टिमाइज़ेशन को हरा देगा.

इस वजह से, कार्रवाई बनाने वाले फ़ंक्शन, स्ट्रिंग के अलावा Args ऑब्जेक्ट को स्वीकार करते हैं. हर Args ऑब्जेक्ट, स्ट्रिंग और डेप्सेट को जोड़ने के बारे में बताता है. डेटा में बदलाव करने के लिए, उसमें वैकल्पिक बदलाव करते हैं. Args ऑब्जेक्ट, डेपसेट को तब तक प्रोसेस नहीं करता, जब तक कि कमांड लाइन का हिसाब लगाने का समय नहीं आ जाता. इससे, विश्लेषण की प्रोसेस पूरी होने तक, किसी भी महंगी कॉपी का इस्तेमाल नहीं किया जा सकता. ज़्यादा जानकारी के लिए परफ़ॉर्मेंस ऑप्टिमाइज़ करना पेज देखें.

Args को ctx.actions.args() पर कॉल करके बनाया गया. इन्हें ctx.actions.run() या ctx.actions.run_shell() के arguments पैरामीटर के तौर पर पास किया जा सकता है. Args ऑब्जेक्ट का हर बदलाव, आखिरी निर्देश लाइन में वैल्यू जोड़ता है.

map_each सुविधा की मदद से, आप यह तय कर सकते हैं कि आइटम को स्ट्रिंग में कैसे बदला जाए. अगर आप map_each फ़ंक्शन नहीं देते, तो स्टैंडर्ड कन्वर्ज़न इस तरह होता है:

  • पहले से स्ट्रिंग की वैल्यू को पहले जैसा ही छोड़ दिया गया है.
  • File ऑब्जेक्ट अपनी File.path वैल्यू में बदल दिए गए हैं.
  • बाकी सभी को स्ट्रिंग के तौर पर किसी तरीके से बदल दिया जाता है. इस वजह से, आपको ऐसी वैल्यू पास करने से बचना चाहिए जो स्ट्रिंग की नहीं हों याFile यहां टाइप करेंadd(), और अगर आप उन्हेंadd_all() याadd_joined() इसके बाद आपकोmap_each फ़ंक्शन.

स्ट्रिंग फ़ॉर्मैटिंग (add*() तरीकों के format, format_each, और format_joined पैरामीटर) का इस्तेमाल करते समय, फ़ॉर्मैट टेंप्लेट को उसी तरह समझा जाता है जैसे स्ट्रिंग पर %- सब्स्टीट्यूशन को छोड़कर टेंप्लेट में सिर्फ़ एक विकल्प प्लेसहोल्डर होना चाहिए और यह %s होना चाहिए. लिटरल प्रतिशत %% के तौर पर छोड़े जा सकते हैं. जैसा कि ऊपर बताया गया है, वैल्यू को स्ट्रिंग में बदलने के बाद फ़ॉर्मैटिंग लागू होती है.

हर add*() तरीके में एक वैकल्पिक फ़ॉर्म होता है जो एक और पोज़िशनल पैरामीटर स्वीकार करता है. "आर्ग्युमेंट का नाम" स्ट्रिंग, बाकी आर्ग्युमेंट से पहले डाली जाती है. इसके लिए:add_all औरadd_joined अगर क्रम खाली होता है, तो दूसरी स्ट्रिंग नहीं जोड़ी जाएगी. उदाहरण के लिए, दिए गए क्रम में val1..val3 शामिल है या खाली. इसके हिसाब से, कमांड लाइन में एक ही इस्तेमाल, --foo val1 val2 val3 --bar या सिर्फ़ --bar को जोड़ा जा सकता है.

अगर कमांड लाइन का साइज़, सिस्टम के तय साइज़ से ज़्यादा बढ़ सकता है, तो आर्ग्युमेंट को पैरामीटर फ़ाइलों में बढ़ाया जा सकता है. use_param_file() और set_param_file_format() देखें.

उदाहरण: मान लें कि हम कमांड लाइन जनरेट करना चाहते थे:

--foo foo1.txt foo2.txt ... fooN.txt --bar bar1.txt,bar2.txt,...,barM.txt --baz
हम इस Args ऑब्जेक्ट का इस्तेमाल कर सकते हैं:
# foo_deps and bar_deps are depsets containing
# File objects for the foo and bar .txt files.
args = ctx.actions.args()
args.add_all("--foo", foo_deps)
args.add_joined("--bar", bar_deps, join_with=",")
args.add("--baz")
ctx.actions.run(
  ...
  arguments = [args],
  ...
)

सदस्य

जोड़ें

Args Args.add(arg_name_or_value, value=unbound, *, format=None)

इस कमांड लाइन में आर्ग्युमेंट जोड़ें.

पैरामीटर

पैरामीटर विवरण
arg_name_or_value ज़रूरी
अगर दो पोज़िशनल पैरामीटर पास किए जाते हैं, तो इसे आर्ग्युमेंट नाम के तौर पर समझा जाता है. आर्ग्युमेंट का नाम, बिना किसी प्रोसेसिंग के वैल्यू से पहले जोड़ दिया जाता है. अगर सिर्फ़ एक पोज़िशनल पैरामीटर पास होता है, तो उसे value के तौर पर समझा जाता है (नीचे देखें).
value डिफ़ॉल्ट = अनबाउंड
जोड़ने के लिए ऑब्जेक्ट. यह ऊपर बताए गए स्टैंडर्ड कन्वर्ज़न का इस्तेमाल करके स्ट्रिंग में बदल जाएगा. इस फ़ंक्शन के लिए कोई map_each पैरामीटर नहीं है, इसलिए value एक स्ट्रिंग या File होना चाहिए. इस तरीके के बजाय, सूची, ट्यूलप, डिसेट या डायरेक्ट्री File को add_all() या add_joined() में पास किया जाना चाहिए.
format string; or None; डिफ़ॉल्ट = कुछ नहीं
फ़ॉर्मैट स्ट्रिंग पैटर्न, जिसे value के स्ट्रिंग वाले वर्शन पर लागू किया जाएगा.

add_all

Args Args.add_all(arg_name_or_values, values=unbound, *, map_each=None, format_each=None, before_each=None, omit_if_empty=True, uniquify=False, expand_directories=True, terminate_with=None, allow_closure=False)

इस कमांड लाइन में कई आर्ग्युमेंट जोड़े जाते हैं. एक्ज़ीक्यूशन के दौरान आइटम को लेज़ी तरीके से प्रोसेस किया जाता है.

ज़्यादातर प्रोसेसिंग, जोड़े जाने वाले आर्ग्युमेंट की सूची के साथ होती है. इसका तरीका नीचे दिया गया है:

  1. हर डायरेक्ट्री File आइटम की जगह, उस डायरेक्ट्री में बार-बार मिलने वाले सभी File को ले लिया जाता है.
  2. अगर map_each दिया गया है, तो इसे हर आइटम पर लागू किया जाता है. साथ ही, नतीजे की सूचियों को आपस में जोड़कर, शुरुआती आर्ग्युमेंट लिस्ट बनाई जाती है. नहीं तो, शुरुआती तर्क सूची हर आइटम पर स्टैंडर्ड कन्वर्ज़न लागू करने से मिलती है.
  3. मौजूद होने पर, सूची में मौजूद हर आर्ग्युमेंट format_each के फ़ॉर्मैट में होता है.
  4. अगर uniquify सही है, तो डुप्लीकेट आर्ग्युमेंट हटा दिए जाते हैं. पहली घटना वही रहती है जो बनी रहती है.
  5. अगर before_each स्ट्रिंग दी गई है, तो सूची में मौजूद हर आर्ग्युमेंट के पहले इसे नए आर्ग्युमेंट के तौर पर डाला जाता है. इस पॉइंट से जोड़े जाने वाले तर्कों की संख्या असरदार तरीके से दोगुनी हो जाती है.
  6. सूची के खाली होने और omit_if_empty के सही (डिफ़ॉल्ट) होने पर, पहले दिए गए आर्ग्युमेंट का नाम और terminate_with, दिए जाने पर पहले और आखिरी आर्ग्युमेंट के तौर पर डाले जाते हैं.
ध्यान दें कि खाली स्ट्रिंग मान्य आर्ग्युमेंट हैं, जो इन प्रोसेस करने के सभी तरीकों के तहत आते हैं.

पैरामीटर

पैरामीटर विवरण
arg_name_or_values ज़रूरी
अगर दो पोज़िशनल पैरामीटर पास किए जाते हैं, तो इसे आर्ग्युमेंट नाम के तौर पर समझा जाता है. आर्ग्युमेंट का नाम, values को बिना किसी प्रोसेसिंग के जोड़ा जाता है. अगर omit_if_empty सही है (डिफ़ॉल्ट) और कोई दूसरा आइटम नहीं जोड़ा गया है, तो इस आर्ग्युमेंट का नाम नहीं जोड़ा जाएगा. इसी तरह, अगर values खाली होता है या इसके सभी आइटम फ़िल्टर होते हैं. अगर सिर्फ़ एक पोज़िशनल पैरामीटर पास होता है, तो उसे values के तौर पर समझा जाता है (नीचे देखें).
values sequence; or depset; डिफ़ॉल्ट = अनबाउंड
वह सूची, टपल या डिपसेट जिसके आइटम जोड़े जाएंगे.
map_each callable; or None; डिफ़ॉल्ट = कोई नहीं
एक फ़ंक्शन जो हर आइटम को शून्य या ज़्यादा स्ट्रिंग में बदलता है. इसे लागू होने से पहले प्रोसेस किया जा सकता है. अगर यह पैरामीटर नहीं दिया गया है, तो स्टैंडर्ड कन्वर्ज़न का इस्तेमाल किया जाता है.

फ़ंक्शन एक या दो पोज़िशनल आर्ग्युमेंट पास किया जाता है: कन्वर्ट होने वाला आइटम और उसके बाद एक वैकल्पिक DirectoryExpander होना चाहिए. दूसरा आर्ग्युमेंट सिर्फ़ तब पास किया जाएगा, जब दिया गया फ़ंक्शन, उपयोगकर्ता के तय किए गए (बिल्ट-इन न) हो और एक से ज़्यादा पैरामीटर के बारे में बताता हो.

रिटर्न वैल्यू का टाइप इस बात पर निर्भर करता है कि सामान के लिए कितने आर्ग्युमेंट बनाए जाने हैं:

  • सामान्य मामले में जब हर आइटम एक स्ट्रिंग में बदल जाता है, तो फ़ंक्शन को उस स्ट्रिंग को दिखाना चाहिए.
  • अगर आइटम को पूरी तरह से फ़िल्टर करना है, तो फ़ंक्शन को None दिखाना चाहिए.
  • अगर आइटम एक से ज़्यादा स्ट्रिंग में बदल जाता है, तो फ़ंक्शन उन स्ट्रिंग की सूची दिखाता है.
किसी एक स्ट्रिंग या None को लौटाने पर, 1 या 0 लंबाई वाली सूची को लौटाने जैसा ही असर पड़ता है. हालांकि, ज़्यादा काम की और आसानी से पढ़ी जा सकने वाली सूची बनाने से बचना, जहां इसकी ज़रूरत न हो.

आम तौर पर, डायरेक्ट्री सेट किए गए आइटम expand_directories=True के सेट होने पर अपने-आप उनके कॉन्टेंट में दिखने लगते हैं. हालांकि, यह अन्य वैल्यू में शामिल डायरेक्ट्री को बड़ा नहीं करेगा. उदाहरण के लिए, जब आइटम ऐसे स्ट्रक्चर होते हैं जिनमें डायरेक्ट्री के तौर पर फ़ील्ड होते हैं. इस स्थिति में, दी गई डायरेक्ट्री की फ़ाइलें मैन्युअल तरीके से पाने के लिए, DirectoryExpander आर्ग्युमेंट लागू किया जा सकता है.

एक्ज़ीक्यूशन फ़ेज़ में बड़ी विश्लेषण के स्तर के डेटा स्ट्रक्चर को गलती से बनाए रखने से बचने के लिए, map_each फ़ंक्शन को टॉप-लेवल def स्टेटमेंट में बताया जाना चाहिए; हो सकता है कि यह डिफ़ॉल्ट रूप से नेस्ट किया गया फ़ंक्शन बंद न हो.

चेतावनी: print() जिन स्टेटमेंट को map_each के दौरान कॉल किया जाता है वे कोई भी आउटपुट नहीं देते.

format_each string; or None; डिफ़ॉल्ट = कोई नहीं
एक वैकल्पिक फ़ॉर्मैट स्ट्रिंग पैटर्न, map_each फ़ंक्शन के ज़रिए रिटर्न की गई हर स्ट्रिंग पर लागू होता है. फ़ॉर्मैट स्ट्रिंग में सिर्फ़ एक '%s' प्लेसहोल्डर होना चाहिए.
before_each string; or None; डिफ़ॉल्ट = कोई नहीं
values से मिले हर आर्ग्युमेंट को जोड़ने से पहले एक वैकल्पिक स्ट्रिंग जोड़ी जाती है.
omit_if_empty डिफ़ॉल्ट = सही
अगर सही होने पर values से कोई तर्क नहीं मिलता है, तो सभी आगे की प्रोसेस छिपा दी जाएगी और कमांड लाइन बदल जाएगी. गलत होने पर, आर्ग्युमेंट का नाम और terminate_with, अगर दिया गया है, तो अब भी जोड़े जाएंगे. भले ही, अन्य आर्ग्युमेंट हों या न हों.
uniquify डिफ़ॉल्ट = गलत
अगर सही है, तो values से लिए गए डुप्लीकेट तर्क छोड़ दिए जाएंगे. हर आर्ग्युमेंट को सिर्फ़ पहली बार प्रोसेस किया जाएगा. आम तौर पर, इस सुविधा की ज़रूरत नहीं होती है, क्योंकि ब्यौरे पहले से ही डुप्लीकेट को मिटा देते हैं. हालांकि, अगर map_each कई आइटम के लिए एक ही स्ट्रिंग देता है, तो यह तरीका फ़ायदेमंद हो सकता है.
expand_directories डिफ़ॉल्ट = सही
अगर सही है, तो values की सभी डायरेक्ट्री को फ़ाइलों की एक फ़्लैट सूची में बड़ा कर दिया जाएगा. यह map_each लागू होने से पहले होता है.
terminate_with string; or None; डिफ़ॉल्ट = कोई नहीं
अन्य सभी तर्कों के बाद जोड़ी जाने वाली एक वैकल्पिक स्ट्रिंग. अगर omit_if_empty सही है (डिफ़ॉल्ट) और कोई दूसरा आइटम नहीं जोड़ा जाता है, तो यह स्ट्रिंग नहीं जोड़ी जाएगी. ऐसा तब होता है, जब values खाली होता है या इसके सभी आइटम फ़िल्टर किए जाते हैं.
allow_closure डिफ़ॉल्ट = गलत
अगर सही है, तो map_each जैसे फ़ंक्शन पैरामीटर में 'बंद है' का इस्तेमाल करने देता है. आम तौर पर, इसकी ज़रूरत नहीं होती. साथ ही, विश्लेषण के फ़ेज़ में बड़े पैमाने पर विश्लेषण करने वाले डेटा स्ट्रक्चर को बनाए रखने में जोखिम होता है.

Add_joined

Args Args.add_joined(arg_name_or_values, values=unbound, *, join_with, map_each=None, format_each=None, format_joined=None, omit_if_empty=True, uniquify=False, expand_directories=True, allow_closure=False)

इस कमांड लाइन में अलग करने के लिए, सेपरेटर का इस्तेमाल करके कई वैल्यू जोड़कर एक साथ जोड़ें. एक्ज़ीक्यूशन के दौरान आइटम को लेज़ी तरीके से प्रोसेस किया जाता है.

प्रोसेस करने जैसा हैadd_all() , लेकिन इससे मिलने वाले आर्ग्युमेंट की सूचीvalues को एक तर्क में जोड़ दिया जाता है, जैसे किjoin_with.join(...) , और इसके बाद दिए गए तरीके से फ़ॉर्मैट किया जाता हैformat_joined स्ट्रिंग टेंप्लेट. add_all() के उलट, कोई before_each या terminate_with पैरामीटर नहीं होता, क्योंकि आम तौर पर ये तब काम नहीं आते हैं, जब आइटम को एक आर्ग्युमेंट में जोड़ा जाता है.

अगर फ़िल्टर करने के बाद किसी आर्ग्युमेंट में शामिल होने के लिए कोई स्ट्रिंग नहीं होती और अगर omit_if_empty सही (डिफ़ॉल्ट) है, तो कोई प्रोसेस नहीं की जाती. अगर कोई स्ट्रिंग नहीं है, लेकिन omit_if_empty गलत है, तो शामिल की गई स्ट्रिंग खाली होगी.

पैरामीटर

पैरामीटर विवरण
arg_name_or_values ज़रूरी
अगर दो पोज़िशनल पैरामीटर पास किए जाते हैं, तो इसे आर्ग्युमेंट नाम के तौर पर समझा जाता है. आर्ग्युमेंट का नाम values से पहले जोड़ा जाता है और इसे प्रोसेस नहीं किया जाता. अगर omit_if_empty सही है (डिफ़ॉल्ट) और एक साथ जुड़ने के लिए values से कोई स्ट्रिंग नहीं मिलती, तो यह आर्ग्युमेंट नहीं जोड़ा जाएगा (जो values के खाली होने या उसके सभी आइटम को फ़िल्टर किए जाने पर हो सकता है).अगर सिर्फ़ एक पोज़िशनल पैरामीटर पास होता है, तो इसे values के तौर पर दिखाया जाता है (नीचे देखें).
values sequence; or depset; डिफ़ॉल्ट = अनबाउंड
वह सूची, टपल या डिपसेट जिसके आइटम शामिल होंगे.
join_with ज़रूरी
डीलिमिटर स्ट्रिंग का इस्तेमाल map_each और format_each को लागू करने वाली स्ट्रिंग को एक साथ जोड़ने के लिए किया जाता है. यह काम उसी तरह किया जाता है जिस तरह string.join() को किया जाता है.
map_each callable; or None; डिफ़ॉल्ट = कोई नहीं
add_all के लिए समान.
format_each string; or None; डिफ़ॉल्ट = कोई नहीं
add_all के लिए समान.
format_joined string; or None; डिफ़ॉल्ट = कोई नहीं
शामिल की गई स्ट्रिंग पर एक वैकल्पिक फ़ॉर्मैट स्ट्रिंग पैटर्न लागू किया गया. फ़ॉर्मैट स्ट्रिंग में सिर्फ़ एक '%s' प्लेसहोल्डर होना चाहिए.
omit_if_empty डिफ़ॉल्ट = सही
अगर सही है, तो शामिल होने के लिए कोई स्ट्रिंग नहीं है (या तो values खाली है या इसके सभी आइटम फ़िल्टर कर दिए गए हैं), फिर सभी आगे की प्रोसेसिंग छोड़ दी जाएगी और कमांड लाइन होगी नहीं बदले. अगर गलत है, तो भले ही किसी स्ट्रिंग को एक साथ नहीं जोड़ा गया हो, दो आर्ग्युमेंट जोड़ दिए जाएंगे: आर्ग्युमेंट का नाम खाली स्ट्रिंग के बाद दिखेगा (जो शून्य स्ट्रिंग का लॉजिकल जॉइन है).
uniquify डिफ़ॉल्ट = गलत
add_all के लिए के जैसा है.
expand_directories डिफ़ॉल्ट = सही
इनके लिए भीadd_all चुनें.
allow_closure डिफ़ॉल्ट = गलत
add_all के लिए के जैसा है.

set_param_file_format:

Args Args.set_param_file_format(format)

अगर पैरामीटर का इस्तेमाल किया जाता है, तो पैरामीटर फ़ाइल का फ़ॉर्मैट सेट करता है

पैरामीटर

पैरामीटर विवरण
format ज़रूरी
इनमें से कोई एक होना चाहिए:
  • "मल्टीलाइन": हर आइटम के लिए पैरामीटर पैरामीटर के नाम में उसके बाद एक नई लाइन जोड़ी जाती है, जिसमें आर्ग्युमेंट का नाम या वैल्यू शामिल होती है.
  • "Shell": "मल्टीलाइन" के समान है, लेकिन आइटम शेल कोट किए गए हैं
  • "flag_per_line": "मल्टीलाइन" के समान, लेकिन (1) पैरामीटर फ़ाइल में सिर्फ़ फ़्लैग ('--' से शुरू होने वाले) लिखे जाते हैं, और (2) फ़्लैग की वैल्यू (अगर कोई है) एक ही लाइन में लिखी जाती हैं को अलग करने वाले बटन का इस्तेमाल करें. यह फ़ॉर्मैट Abseil फ़्लैग लाइब्रेरी के हिसाब से है.

अगर कॉल नहीं किया जाता है, तो फ़ॉर्मैट डिफ़ॉल्ट रूप से "शेल" पर सेट होता है.

यूज़_param_file

Args Args.use_param_file(param_file_arg, *, use_always=False)

आर्ग्युमेंट को पैरामीटर फ़ाइल में बदलकर, पैरामीटर की जानकारी में बदल देता है. इसका इस्तेमाल तब करें, जब आपके आर्ग्युमेंट सिस्टम की कमांड लंबाई की सीमाओं के हिसाब से बहुत बड़े हों.

बेज़ेल दक्षता के लिए पैरामीटर के दौरान पैरामीटर फ़ाइल को आउटपुट ट्री में लिखने से अलग हो सकता है.अगर आप डीबग की कार्रवाइयां कर रहे हैं और पैरामीटर फ़ाइल की जांच करना चाहते हैं, तो अपने बिल्ड के लिए --materialize_param_files पास करें.

पैरामीटर

पैरामीटर विवरण
param_file_arg ज़रूरी
एक फ़ॉर्मैट स्ट्रिंग जिसमें "%s" हो. अगर आर्ग्युमेंट किसी पैरामीटर फ़ाइल में डाले जाते हैं, तो उन्हें उस आर्ग्युमेंट से बदल दिया जाता है जिसमें पैरामीटर फ़ाइल का पाथ, फ़ॉर्मैट की गई हो.

उदाहरण के लिए, अगर आर्ग्युमेंट किसी पैरामीटर फ़ाइल "params.txt" में फैले हैं, तो "--file=%s" तय करने से, ऐक्शन कमांड लाइन में "--file=params.txt" हो जाएगा.

use_always डिफ़ॉल्ट = गलत
क्या पैरामीटर को किसी पैरामीटर फ़ाइल में हमेशा बढ़ाना है. अगर गलत है, तो बेज़ल तय करेगा कि आपके सिस्टम और आर्ग्युमेंट की लंबाई के आधार पर, आर्ग्युमेंट को बढ़ाया जाना चाहिए या नहीं.