ऐसा ऑब्जेक्ट जो कम मेमोरी में, कमांड लाइन के कुछ हिस्से या पूरे हिस्से को बनाने के लिए ज़रूरी डेटा को शामिल करता है.
अक्सर ऐसा होता है कि किसी कार्रवाई के लिए, बड़ी कमांड लाइन की ज़रूरत होती है. इसमें ट्रांज़िशन डेपेंडेंसी से इकट्ठा की गई वैल्यू होती हैं. उदाहरण के लिए, लिंकर कमांड लाइन में उन सभी ऑब्जेक्ट फ़ाइलों की सूची हो सकती है जिनकी ज़रूरत लिंक की जा रही सभी लाइब्रेरी को होती है. ऐसे ट्रांज़िटिव डेटा को depset
में स्टोर करना सबसे सही तरीका है, ताकि उसे एक से ज़्यादा टारगेट शेयर कर सकें. हालांकि, अगर नियम बनाने वाले को ऐक्शन कमांड लाइन बनाने के लिए, इन डिपसेट को स्ट्रिंग की सूचियों में बदलना पड़ता है, तो यह मेमोरी शेयर करने के ऑप्टिमाइज़ेशन को खत्म कर देगा.
इसी वजह से, ऐक्शन कंस्ट्रक्शन के फ़ंक्शन, स्ट्रिंग के साथ-साथ Args
ऑब्जेक्ट भी स्वीकार करते हैं. हर Args
ऑब्जेक्ट, स्ट्रिंग और डेपसेट को जोड़ने के तरीके दिखाता है. इनमें डेटा में बदलाव करने के लिए, वैकल्पिक ट्रांसफ़ॉर्मेशन ऐक्शन भी शामिल होते हैं. Args
ऑब्जेक्ट, कमांड लाइन का हिसाब लगाने के दौरान, एक्ज़ीक्यूशन के चरण तक उन डिपसेट को प्रोसेस नहीं करते हैं जिन्हें वे एनकैप्सुलेट करते हैं. इससे, विश्लेषण पूरा होने तक, महंगी कॉपी करने की प्रक्रिया को रोका जा सकता है. ज़्यादा जानकारी के लिए, परफ़ॉर्मेंस ऑप्टिमाइज़ करना पेज देखें.
Args
को ctx.actions.args()
को कॉल करके बनाया गया है. उन्हें ctx.actions.run()
या ctx.actions.run_shell()
के arguments
पैरामीटर के तौर पर पास किया जा सकता है. Args
ऑब्जेक्ट के हर म्यूटेशन से, आखिर में बनने वाली कमांड लाइन में वैल्यू जुड़ जाती हैं.
map_each
सुविधा की मदद से, आइटम को स्ट्रिंग में बदलने के तरीके को पसंद के मुताबिक बनाया जा सकता है. अगर आपने map_each
फ़ंक्शन नहीं दिया है, तो स्टैंडर्ड कन्वर्ज़न इस तरह से होगा:
- पहले से स्ट्रिंग वाली वैल्यू को वैसे ही छोड़ दिया जाता है.
File
ऑब्जेक्ट को उनकीFile.path
वैल्यू में बदला जाता है.- बाकी सभी टाइप को तय नहीं तरीके से स्ट्रिंग में बदल दिया जाता है. इस वजह से, आपको
add()
को ऐसी वैल्यू पास करने से बचना चाहिए जो स्ट्रिंग याFile
टाइप की न हों. साथ ही, अगर उन्हेंadd_all()
याadd_joined()
पर पास किया जाता है, तो आपको एकmap_each
फ़ंक्शन देना चाहिए.
स्ट्रिंग फ़ॉर्मैटिंग (add*()
के तरीकों के format
, format_each
, और format_joined
पैरामीटर) का इस्तेमाल करते समय, फ़ॉर्मैट टेंप्लेट को उसी तरह से समझा जाता है जिस तरह स्ट्रिंग में %
-सबस्टिट्यूशन किया जाता है. हालांकि, टेंप्लेट में सिर्फ़ एक सबस्टिट्यूशन प्लेसहोल्डर होना चाहिए और वह %s
होना चाहिए. प्रतिशत के लिटरल को %%
के तौर पर एस्केप किया जा सकता है. ऊपर दी गई जानकारी के हिसाब से, वैल्यू को स्ट्रिंग में बदलने के बाद फ़ॉर्मैटिंग लागू होती है.
हर add*()
के तरीके का एक वैकल्पिक फ़ॉर्म होता है, जिसमें एक और पोज़िशनल पैरामीटर, "आर्ग का नाम" स्वीकार किया जाता है स्ट्रिंग का इस्तेमाल करें. अगर add_all
और add_joined
के लिए, क्रम खाली है, तो अतिरिक्त स्ट्रिंग नहीं जोड़ी जाएगी. उदाहरण के लिए, इसी इस्तेमाल में कमांड लाइन में --foo val1 val2 val3 --bar
या सिर्फ़ --bar
जोड़ा जा सकता है. यह इस बात पर निर्भर करता है कि दिए गए क्रम में val1..val3
है या खाली है.
अगर कमांड लाइन का साइज़, सिस्टम की तय सीमा से ज़्यादा हो सकता है, तो पैरामीटर फ़ाइलों में आर्ग्युमेंट डाले जा सकते हैं. 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
|
डिफ़ॉल्ट रूप से unbound है जोड़ा जाने वाला ऑब्जेक्ट. इसे ऊपर बताए गए स्टैंडर्ड कन्वर्ज़न का इस्तेमाल करके, स्ट्रिंग में बदल दिया जाएगा. इस फ़ंक्शन के लिए कोई map_each पैरामीटर नहीं है, इसलिए value स्ट्रिंग या File होना चाहिए. सूची, टपल, डिप्सेट या डायरेक्ट्री File को इस तरीके के बजाय, add_all() या add_joined() को पास किया जाना चाहिए.
|
format
|
string या None ;
डिफ़ॉल्ट तौर पर 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)इस कमांड लाइन में कई आर्ग्युमेंट जोड़ता है. प्लान लागू करने के दौरान, आइटम को लेज़ी तरीके से प्रोसेस किया जाता है.
ज़्यादातर प्रोसेसिंग, जोड़ने के लिए दी गई आर्ग्युमेंट की सूची पर होती है. यह प्रोसेस, यहां दिए गए चरणों के हिसाब से होती है:
- हर डायरेक्ट्री
File
आइटम को, उस डायरेक्ट्री में मौजूद सभीFile
से बदल दिया जाता है. - अगर
map_each
दिया गया है, तो इसे हर आइटम पर लागू किया जाता है. इसके बाद, नतीजे के तौर पर मिलने वाली स्ट्रिंग की सूचियां जोड़ी जाती हैं, ताकि शुरुआती आर्ग्युमेंट की सूची बनाई जा सके. नहीं तो, शुरुआती तर्क सूची हर आइटम पर स्टैंडर्ड कन्वर्ज़न लागू करने से मिलती है. - अगर सूची में मौजूद हर आर्ग्युमेंट मौजूद है, तो उसे
format_each
से फ़ॉर्मैट किया जाता है. - अगर
uniquify
सही है, तो डुप्लीकेट आर्ग्युमेंट हटा दिए जाते हैं. पहली घटना बरकरार रहती है. - अगर
before_each
स्ट्रिंग दी जाती है, तो सूची में मौजूद हर आर्ग्युमेंट से पहले, इसे नए आर्ग्युमेंट के तौर पर डाला जाता है. इससे, इस पॉइंट तक जोड़े जाने वाले आर्ग्युमेंट की संख्या दोगुनी हो जाती है. - अगर सूची खाली है और
omit_if_empty
'सही है' (डिफ़ॉल्ट तौर पर) है, तो आर्ग्युमेंट के नाम औरterminate_with
पहले और आखिरी आर्ग्युमेंट के तौर पर डाले जाते हैं. हालांकि, यह तब ही डाला जाएगा, जब ये दिए गए होंगे.
पैरामीटर
पैरामीटर | ब्यौरा |
---|---|
arg_name_or_values
|
ज़रूरी है अगर दो पोज़िशनल पैरामीटर पास किए जाते हैं, तो इसे आर्ग्युमेंट के नाम के तौर पर समझा जाता है. आर्ग्युमेंट के नाम को values से पहले, बिना किसी प्रोसेसिंग के एक अलग आर्ग्युमेंट के तौर पर जोड़ा जाता है. अगर omit_if_empty 'सही है' (डिफ़ॉल्ट) है और कोई दूसरा आइटम नहीं जोड़ा गया है, तो यह आर्ग्युमेंट का नाम नहीं जोड़ा जाएगा. ऐसा तब होता है, जब values खाली हो या उसके सभी आइटम फ़िल्टर किए गए हों. अगर सिर्फ़ एक पोज़िशनल पैरामीटर पास किया जाता है, तो उसे values के तौर पर समझा जाता है (यहां देखें).
|
values
|
sequence; या डिप्सेट;
डिफ़ॉल्ट unbound है वह सूची, टपल या डिप्सेट, जिनके आइटम जोड़े जाएंगे. |
map_each
|
callable; या None ;
डिफ़ॉल्ट रूप से None है एक ऐसा फ़ंक्शन जो हर आइटम को शून्य या उससे ज़्यादा स्ट्रिंग में बदलता है. इन्हें जोड़ने से पहले प्रोसेस किया जा सकता है. अगर यह पैरामीटर नहीं दिया गया है, तो स्टैंडर्ड कन्वर्ज़न का इस्तेमाल किया जाता है. फ़ंक्शन में एक या दो पोज़िशनल आर्ग्युमेंट पास किए जाते हैं: बदलने के लिए आइटम और उसके बाद वैकल्पिक रिटर्न वैल्यू का टाइप इस बात पर निर्भर करता है कि आइटम के लिए कितने आर्ग्युमेंट जनरेट करने हैं:
None दिखाने का असर, क्रमशः एक या शून्य लंबाई वाली सूची दिखाने जैसा ही होता है. हालांकि, ऐसी सूची बनाने से बचना ज़्यादा आसान और पढ़ने लायक है जहां इसकी ज़रूरत न हो.आम तौर पर, विश्लेषण के चरण में, विश्लेषण के चरण वाले बड़े डेटा स्ट्रक्चर के अनचाहे रखरखाव से बचने के लिए, चेतावनी: |
format_each
|
स्ट्रिंग या None ;
डिफ़ॉल्ट रूप से None यह map_each फ़ंक्शन से मिली हर स्ट्रिंग पर लागू होने वाला, स्ट्रिंग का कोई वैकल्पिक फ़ॉर्मैट पैटर्न है. फ़ॉर्मैट स्ट्रिंग में सिर्फ़ एक '%s' प्लेसहोल्डर होना चाहिए.
|
before_each
|
string; या None ;
डिफ़ॉल्ट रूप से None है values से निकाले गए हर तर्क से पहले जोड़ने के लिए एक वैकल्पिक तर्क जोड़ा जाता है.
|
omit_if_empty
|
डिफ़ॉल्ट तौर पर, इसकी वैल्यू True होती है अगर यह सही है और values से कोई आर्ग्युमेंट नहीं जोड़ा जाता है, तो आगे की प्रोसेसिंग रोक दी जाती है और कमांड लाइन में कोई बदलाव नहीं होता. अगर यह फ़ील्ड 'गलत' पर सेट है, तो आर्ग्युमेंट का नाम और terminate_with , अगर दिया गया है, तो उसे जोड़ दिया जाएगा. भले ही, कोई अन्य आर्ग्युमेंट दिया गया हो या नहीं.
|
uniquify
|
डिफ़ॉल्ट रूप से False अगर यह वैल्यू 'सही है' पर सेट है, तो values से मिले डुप्लीकेट आर्ग्युमेंट हटा दिए जाएंगे. हर आर्ग्युमेंट की सिर्फ़ पहली बार होने वाली वैल्यू ही दिखेगी. आम तौर पर, इस सुविधा की ज़रूरत नहीं होती, क्योंकि डेपसेट पहले से ही डुप्लीकेट को हटा देते हैं. हालांकि, अगर map_each एक से ज़्यादा आइटम के लिए एक ही स्ट्रिंग दिखाता है, तो यह सुविधा काम की हो सकती है.
|
expand_directories
|
डिफ़ॉल्ट तौर पर, यह True पर सेट होता है अगर यह 'सही' पर सेट है, तो values में मौजूद किसी भी डायरेक्ट्री को फ़ाइलों की फ़्लैट सूची में बड़ा किया जाएगा. यह map_each लागू होने से पहले होता है.
|
terminate_with
|
string या None ;
डिफ़ॉल्ट तौर पर None होता है अन्य सभी आर्ग्युमेंट के बाद जोड़ने के लिए, वैकल्पिक आर्ग्युमेंट. अगर omit_if_empty 'सही है' (डिफ़ॉल्ट) पर सेट है और कोई अन्य आइटम नहीं जोड़ा गया है, तो यह आर्ग्युमेंट नहीं जोड़ा जाएगा. ऐसा तब होता है, जब values खाली हो या उसके सभी आइटम फ़िल्टर कर दिए गए हों.
|
allow_closure
|
डिफ़ॉल्ट रूप से False अगर यह 'सही' है, तो 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 या depset;
डिफ़ॉल्ट तौर पर unbound होता है वह सूची, ट्यूपल या depset जिसका डेटा जॉइन किया जाएगा. |
join_with
|
ज़रूरी है डिलिमिटर स्ट्रिंग, map_each और format_each को लागू करने से मिली स्ट्रिंग को एक साथ जोड़ने के लिए इस्तेमाल की जाती है. यह string.join() की तरह ही काम करती है.
|
map_each
|
callable; या None ;
डिफ़ॉल्ट None है यह add_all के लिए भी वैसा ही है.
|
format_each
|
string; या None ;
डिफ़ॉल्ट रूप से None है add_all के बराबर ही.
|
format_joined
|
string या None ;
डिफ़ॉल्ट तौर पर None होता है जॉइन की गई स्ट्रिंग पर लागू किया जाने वाला फ़ॉर्मैट स्ट्रिंग पैटर्न. यह पैटर्न इस्तेमाल करना ज़रूरी नहीं है. प्रारूप स्ट्रिंग में ठीक एक '%s' होना चाहिए प्लेसहोल्डर. |
omit_if_empty
|
डिफ़ॉल्ट तौर पर, इसकी वैल्यू True होती है अगर यह वैल्यू 'सही' है और values खाली है या इसके सभी आइटम फ़िल्टर किए गए हैं, तो स्ट्रिंग को आपस में जोड़ने की प्रोसेस पूरी नहीं की जाएगी और कमांड लाइन में कोई बदलाव नहीं होगा. अगर गलत है, तो भले ही एक साथ जोड़ने के लिए कोई स्ट्रिंग न हो, तब भी दो आर्ग्युमेंट जोड़ दिए जाएंगे: आर्ग्युमेंट के नाम के बाद एक खाली स्ट्रिंग (जो शून्य स्ट्रिंग का लॉजिकल जुड़ना होता है).
|
uniquify
|
डिफ़ॉल्ट रूप से False है add_all के लिए भी वैसा ही है.
|
expand_directories
|
डिफ़ॉल्ट तौर पर True होता है यह वैल्यू, add_all के लिए भी वही होती है.
|
allow_closure
|
डिफ़ॉल्ट रूप से False है add_all के लिए भी वैसा ही है.
|
set_param_file_format
Args Args.set_param_file_format(format)अगर किसी पैरामीटर फ़ाइल का इस्तेमाल किया जाता है, तो यह पैरामीटर फ़ाइल का फ़ॉर्मैट सेट करता है अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
पैरामीटर
पैरामीटर | ब्यौरा |
---|---|
format
|
ज़रूरी है इनमें से कोई एक होना चाहिए:
अगर फ़ॉर्मैट को कॉल नहीं किया जाता है, तो यह डिफ़ॉल्ट रूप से "शेल" पर सेट हो जाता है. |
use_param_file
Args Args.use_param_file(param_file_arg, *, use_always=False)यह पैरामीटर को पैरामीटर फ़ाइल में डालता है और उन्हें पैरामीटर फ़ाइल के पॉइंटर से बदल देता है. इसका इस्तेमाल तब करें, जब आपके आर्ग, सिस्टम की कमांड लंबाई सीमाओं के हिसाब से बहुत बड़े हों.
Bazel, बेहतर परफ़ॉर्मेंस के लिए, प्रोग्राम को चलाने के दौरान आउटपुट ट्री में पैरामीटर फ़ाइल को लिखने से बच सकता है. अगर कार्रवाइयों को डीबग किया जा रहा है और आपको पैरामीटर फ़ाइल की जांच करनी है, तो अपने बिल्ड में --materialize_param_files
को पास करें.
पैरामीटर
पैरामीटर | ब्यौरा |
---|---|
param_file_arg
|
ज़रूरी है सिंगल "%s" वाली फ़ॉर्मैट स्ट्रिंग. अगर आर्ग्युमेंट किसी पैरामीटर फ़ाइल में दिए जाते हैं, तो उन्हें पैरामीटर फ़ाइल के पाथ के साथ फ़ॉर्मैट की गई इस स्ट्रिंग वाले आर्ग्युमेंट से बदल दिया जाता है. उदाहरण के लिए, अगर args को पैरामीटर फ़ाइल "params.txt" में डाला जाता है, तो "--file=%s" तय करने पर, ऐक्शन कमांड लाइन में "--file=params.txt" शामिल हो जाएगा. |
use_always
|
डिफ़ॉल्ट रूप से False क्या हमेशा पैरामीटर फ़ाइल में आर्ग्युमेंट डालने हैं. अगर यह वैल्यू 'गलत' है, तो आपके सिस्टम और आर्ग्युमेंट की लंबाई के आधार पर, bazel यह तय करेगा कि आर्ग्युमेंट को स्पिल करना है या नहीं. |