यह एक ऐसा ऑब्जेक्ट है जो कम मेमोरी में, कमांड लाइन के कुछ हिस्से या पूरे हिस्से को बनाने के लिए ज़रूरी डेटा को शामिल करता है.
अक्सर ऐसा होता है कि किसी कार्रवाई के लिए, बड़ी कमांड लाइन की ज़रूरत होती है. इसमें ट्रांज़िशन वाली डिपेंडेंसी से इकट्ठा की गई वैल्यू होती हैं. उदाहरण के लिए, लिंकर कमांड लाइन में उन सभी ऑब्जेक्ट फ़ाइलों की सूची हो सकती है जो लिंक की जा रही सभी लाइब्रेरी के लिए ज़रूरी हैं. सबसे सही तरीका यह है कि इस तरह के ट्रांज़िशन डेटा को depset
में सेव किया जाए, ताकि उन्हें कई टारगेट के साथ शेयर किया जा सके. हालांकि, अगर नियम बनाने वाले को ऐक्शन कमांड लाइन बनाने के लिए, इन डिपसेट को स्ट्रिंग की सूचियों में बदलना पड़ता है, तो यह मेमोरी शेयर करने के ऑप्टिमाइज़ेशन को खत्म कर देगा.
इस वजह से, कार्रवाई बनाने वाले फ़ंक्शन, स्ट्रिंग के अलावा Args
ऑब्जेक्ट भी स्वीकार करते हैं. हर Args
ऑब्जेक्ट, डेटा में बदलाव करने के लिए वैकल्पिक ट्रांसफ़ॉर्मेशन के साथ, स्ट्रिंग और डेपसेट को जोड़ता है. Args
ऑब्जेक्ट, तब तक उन डिप्सेट को प्रोसेस नहीं करते जिन्हें वे एनकैप्सुलेट करते हैं. ऐसा तब होता है, जब कमांड लाइन का हिसाब लगाने के लिए, उन्हें लागू करने का फ़ेज़ शुरू होता है. इससे, विश्लेषण पूरा होने तक, महंगी कॉपी करने की प्रक्रिया को रोका जा सकता है. ज़्यादा जानकारी के लिए, परफ़ॉर्मेंस को ऑप्टिमाइज़ करना पेज देखें.
Args
को ctx.actions.args()
को कॉल करके बनाया जाता है. इन्हें ctx.actions.run()
या ctx.actions.run_shell()
के arguments
पैरामीटर के तौर पर पास किया जा सकता है. Args
ऑब्जेक्ट के हर म्यूटेशन से, आखिर में बनने वाली कमांड लाइन में वैल्यू जुड़ जाती हैं.
map_each
सुविधा की मदद से, आइटम को स्ट्रिंग में बदलने का तरीका पसंद के मुताबिक बनाया जा सकता है. अगर आपने map_each
फ़ंक्शन नहीं दिया है, तो स्टैंडर्ड कन्वर्ज़न इस तरह होगा:
- पहले से स्ट्रिंग वाली वैल्यू को वैसे ही छोड़ दिया जाता है.
File
ऑब्जेक्ट को उनकीFile.path
वैल्यू में बदल दिया जाता है.Label
ऑब्जेक्ट को स्ट्रिंग के तौर पर दिखाया जाता है. मुख्य रिपॉज़िटरी के संदर्भ में हल करने पर, यह स्ट्रिंग उसी ऑब्जेक्ट में बदल जाती है. अगर संभव हो, तो स्ट्रिंग रिप्रज़ेंटेशन में, किसी रिपॉज़िटरी के कैननिकल नेम के बजाय, उसके सामान्य नाम का इस्तेमाल किया जाता है. इससे यह रिप्रज़ेंटेशन, BUILD फ़ाइलों में इस्तेमाल के लिए सही हो जाता है. हालांकि, यह ज़रूरी नहीं है कि//foo:bar
,@repo//foo:bar
, और@@canonical_name~//foo:bar.bzl
जैसे सामान्य उदाहरणों के अलावा, कोई और उदाहरण भी दिया जाए.- अन्य सभी टाइप को तय नहीं किए गए तरीके से स्ट्रिंग में बदल दिया जाता है. इसलिए, आपको
add()
में स्ट्रिंग याFile
टाइप के अलावा किसी अन्य टाइप की वैल्यू पास करने से बचना चाहिए. अगर आपको उन्हेंadd_all()
याadd_joined()
में पास करना है, तो आपकोmap_each
फ़ंक्शन देना चाहिए.
स्ट्रिंग फ़ॉर्मैटिंग (add*()
के तरीकों के format
, format_each
, और format_joined
पैरामीटर) का इस्तेमाल करते समय, फ़ॉर्मैट टेंप्लेट को उसी तरह से समझा जाता है जिस तरह स्ट्रिंग में %
-सबस्टिट्यूशन किया जाता है. हालांकि, टेंप्लेट में सिर्फ़ एक सबस्टिट्यूशन प्लेसहोल्डर होना चाहिए और वह %s
होना चाहिए. प्रतिशत के लिटरल को %%
के तौर पर एस्केप किया जा सकता है. ऊपर बताए गए तरीके से वैल्यू को स्ट्रिंग में बदलने के बाद, फ़ॉर्मैटिंग लागू की जाती है.
add*()
के हर तरीके का एक वैकल्पिक फ़ॉर्म होता है, जो एक अतिरिक्त पोज़िशनल पैरामीटर स्वीकार करता है. यह "arg name" स्ट्रिंग होती है, जिसे बाकी सभी आर्ग्युमेंट से पहले डाला जाता है. अगर 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 में से कोई एक होना चाहिए. इस तरीके के बजाय, add_all() या add_joined() को सूची, ट्यूपल, डिप्सेट या डायरेक्ट्री File पास करना होगा.
|
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
|
ज़रूरी अगर दो पोज़िशनल पैरामीटर पास किए जाते हैं, तो इसे आर्ग्युमेंट के नाम के तौर पर समझा जाता है. arg नाम को values से पहले, बिना किसी प्रोसेसिंग के अलग आर्ग्युमेंट के तौर पर जोड़ा जाता है. अगर omit_if_empty 'सही है' (डिफ़ॉल्ट) है और कोई दूसरा आइटम नहीं जोड़ा गया है, तो यह आर्ग्युमेंट का नाम नहीं जोड़ा जाएगा. ऐसा तब होता है, जब values खाली हो या उसके सभी आइटम फ़िल्टर किए गए हों. अगर सिर्फ़ एक पोज़िशनल पैरामीटर पास किया जाता है, तो उसे values के तौर पर समझा जाता है (यहां देखें).
|
values
|
sequence या depset;
डिफ़ॉल्ट तौर पर unbound होता है वह सूची, ट्यूपल या depset जिसका आइटम जोड़ा जाएगा. |
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 खाली है या इसके सभी आइटम फ़िल्टर किए गए हैं, तो स्ट्रिंग को आपस में जोड़ने की प्रोसेस पूरी नहीं की जाएगी और कमांड लाइन में कोई बदलाव नहीं होगा. अगर यह फ़ील्ड false है, तो एक साथ जोड़ने के लिए कोई स्ट्रिंग न होने पर भी, दो आर्ग्युमेंट जोड़ दिए जाएंगे: आर्ग्युमेंट का नाम और उसके बाद खाली स्ट्रिंग (जो शून्य स्ट्रिंग का लॉजिकल जॉइन है).
|
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 को पैरामीटर फ़ाइल में स्पिल किया जाता है, तो उन्हें पैरामीटर फ़ाइल के पाथ के साथ फ़ॉर्मैट की गई इस स्ट्रिंग से बने आर्ग्युमेंट से बदल दिया जाता है. उदाहरण के लिए, अगर args को पैरामीटर फ़ाइल "params.txt" में डाला जाता है, तो "--file=%s" तय करने पर, ऐक्शन कमांड लाइन में "--file=params.txt" शामिल हो जाएगा. |
use_always
|
डिफ़ॉल्ट रूप से False क्या हमेशा पैरामीटर फ़ाइल में आर्ग्युमेंट डालने हैं. अगर यह वैल्यू 'गलत' है, तो आपके सिस्टम और आर्ग्युमेंट की लंबाई के आधार पर, bazel यह तय करेगा कि आर्ग्युमेंट को स्पिल करना है या नहीं. |