ऐसा अक्सर होता है कि किसी कार्रवाई के लिए, एक बड़ी कमांड लाइन की ज़रूरत होती है, जिसमें ट्रांज़िटिव डिपेंडेंसी से वैल्यू इकट्ठा होती हैं. उदाहरण के लिए, कोई लिंकर कमांड लाइन लिंक की जा रही सभी लाइब्रेरी के लिए ज़रूरी हर ऑब्जेक्ट फ़ाइल की सूची बना सकती है. ऐसे सार्वजनिक परिवहन डेटा को 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()
पर पास न करें. अगरadd_all()
याadd_joined()
को पास किया जाता है, तो आपकोmap_each
फ़ंक्शन देना चाहिए.
स्ट्रिंग फ़ॉर्मैटिंग (format
, format_each
, और add*()
तरीकों के 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], ... )
पैसे चुकाकर बने सदस्य
- जोड़ें
- add_all
- add_joined
- set_param_file_format को सेट करना
- use_param_file
जोड़ें
Args Args.add(arg_name_or_value, value=unbound, *, format=None)इस कमांड लाइन में आर्ग्युमेंट जोड़ता है.
पैरामीटर
पैरामीटर | जानकारी |
---|---|
arg_name_or_value
|
ज़रूरी है अगर दो पोज़िशनल पैरामीटर पास किए जाते हैं, तो उन्हें आर्ग्युमेंट के नाम से जाना जाता है. आर्ग्युमेंट का नाम, बिना किसी प्रोसेसिंग के वैल्यू से पहले जोड़ दिया जाता है. अगर सिर्फ़ एक पोज़िशनल पैरामीटर पास होता है, तो उसे value के तौर पर देखा जाता है (नीचे देखें).
|
value
|
डिफ़ॉल्ट = अनबाउंड जोड़ने के लिए ऑब्जेक्ट. यह ऊपर बताए गए स्टैंडर्ड कन्वर्ज़न का इस्तेमाल करके, स्ट्रिंग में बदल जाएगा. इस फ़ंक्शन के लिए कोई map_each पैरामीटर नहीं है. इसलिए, value एक स्ट्रिंग या File होनी चाहिए. इस सूची के बजाय, add_all() या add_joined() को सूची, टपल, डिसेट या डायरेक्ट्री पास करना ज़रूरी है.
|
format
|
string; or None :
डिफ़ॉल्ट = कोई नहींvalue के स्ट्रिंग वाले वर्शन पर लागू किया जाने वाला फ़ॉर्मैट स्ट्रिंग पैटर्न.
|
सभी_जोड़ें
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; or depset :
डिफ़ॉल्ट = अनबाउंडवह सूची, ट्यूल या डेपसेट जिसके आइटम जोड़े जाएंगे. |
map_each
|
callable; or None :
डिफ़ॉल्ट = कोई नहींएक ऐसा फ़ंक्शन है जो हर आइटम को शून्य या उससे ज़्यादा स्ट्रिंग में बदलता है. इसे जोड़ने से पहले प्रोसेस किया जा सकता है. अगर यह पैरामीटर नहीं दिया गया है, तो स्टैंडर्ड कन्वर्ज़न का इस्तेमाल किया जाता है. फ़ंक्शन को एक या दो पोज़िशनल आर्ग्युमेंट दिए जाते हैं: बदला जाने वाला आइटम और उसके बाद वैकल्पिक सामान लौटाने की वैल्यू का टाइप, इस बात पर निर्भर करता है कि सामान के लिए कितने आर्ग्युमेंट बनाए जाने हैं:
None को दिखाने का असर, 1 वर्णों की लंबाई या 0 वाली सूची को रिटर्न करने के जैसा ही होता है. हालांकि, बेहतर और आसानी से पढ़ने लायक सूची बनाने से बचा जा सकता है, जहां यह ज़रूरी नहीं है.आम तौर पर, एक्ज़ीक्यूशन के फ़ेज़ में बड़े ऐनलिसिस के चरण वाले डेटा के स्ट्रक्चर को बनाए रखने के लिए, चेतावनी: |
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
|
ज़रूरी है डीलिमिटर स्ट्रिंग, जो string.join() की तरह ही map_each और format_each को लागू करने पर मिलने वाली स्ट्रिंग में शामिल होने के लिए इस्तेमाल की जाती है.
|
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
|
ज़रूरी है इनमें से कोई एक होना चाहिए:
कॉल न करने पर, फ़ॉर्मैट डिफ़ॉल्ट तौर पर "शेल" पर सेट हो जाता है. |
Use_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
|
डिफ़ॉल्ट = False क्या पैरामीटर को हमेशा किसी पैरामीटर फ़ाइल में बांटना है या नहीं. अगर गलत है, तो बेज़ल यह तय करेगा कि आपके सिस्टम और आर्ग्युमेंट की लंबाई के आधार पर आर्ग्युमेंट को स्प्लिट करना है या नहीं. |