ऐसा अक्सर होता है कि किसी कार्रवाई के लिए, ट्रांज़िटिव डिपेंडेंसी से इकट्ठा की गई वैल्यू वाली बड़ी कमांड लाइन की ज़रूरत होती है. उदाहरण के लिए, लिंकर कमांड लाइन में लिंक की जा रही सभी लाइब्रेरी के लिए ज़रूरी हर ऑब्जेक्ट फ़ाइल की सूची दी जा सकती है. ऐसे ट्रांज़िटिव डेटा को 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जैसे उदाहरण शामिल होते हैं.- अन्य सभी टाइप को unspecified तरीके से स्ट्रिंग में बदल दिया जाता है. इसलिए, आपको
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
|
ज़रूरी है अगर दो पोज़ीशनल पैरामीटर पास किए जाते हैं, तो इसे आर्ग्युमेंट के नाम के तौर पर माना जाता है. आर्ग्युमेंट के नाम को values से पहले, अलग आर्ग्युमेंट के तौर पर जोड़ा जाता है. इसमें कोई बदलाव नहीं किया जाता. अगर omit_if_empty की वैल्यू 'सही है' (डिफ़ॉल्ट) पर सेट है और कोई अन्य आइटम नहीं जोड़ा गया है, तो इस आर्ग्युमेंट का नाम नहीं जोड़ा जाएगा. ऐसा तब होता है, जब values खाली हो या उसके सभी आइटम फ़िल्टर किए गए हों. अगर सिर्फ़ एक पोज़ीशनल पैरामीटर पास किया जाता है, तो इसे values के तौर पर माना जाता है (नीचे देखें).
|
values
|
sequence; या depset;
डिफ़ॉल्ट रूप से unboundहोता है वह सूची, टपल या depset जिसके आइटम जोड़े जाएंगे. |
map_each
|
callable; or None;
default is NoneA function that converts each item to zero or more strings, which may be further processed before appending. अगर यह पैरामीटर उपलब्ध नहीं कराया जाता है, तो स्टैंडर्ड कन्वर्ज़न का इस्तेमाल किया जाता है. इस फ़ंक्शन को एक या दो पोज़िशनल आर्ग्युमेंट पास किए जाते हैं: पहला, बदलने के लिए आइटम और दूसरा, वैकल्पिक आइटम के लिए कितने आर्ग्युमेंट जनरेट करने हैं, इसके आधार पर रिटर्न वैल्यू का टाइप तय होता है:
None को वापस लाने का मतलब है कि लंबाई 1 या लंबाई 0 वाली सूची को वापस लाया गया है. हालांकि, जहां सूची बनाने की ज़रूरत नहीं है वहां सूची न बनाना ज़्यादा सही और आसानी से समझा जा सकता है.आम तौर पर, जब विश्लेषण के चरण में इस्तेमाल किए गए बड़े डेटा स्ट्रक्चर को एक्ज़ीक्यूशन के चरण में अनजाने में बनाए रखने से बचने के लिए, चेतावनी: |
format_each
|
string; या None;
डिफ़ॉल्ट रूप से Noneहोता है यह फ़ॉर्मैट स्ट्रिंग पैटर्न है. इसे map_each फ़ंक्शन से मिले हर स्ट्रिंग पर लागू किया जाता है. फ़ॉर्मैट स्ट्रिंग में सिर्फ़ एक '%s' प्लेसहोल्डर होना चाहिए.
|
before_each
|
string या None;
डिफ़ॉल्ट तौर पर Noneहोता है यह एक ऐसा आर्ग्युमेंट है जिसे values से मिले हर आर्ग्युमेंट से पहले जोड़ा जा सकता है.
|
omit_if_empty
|
bool;
डिफ़ॉल्ट रूप से Trueहोता है अगर यह 'सही' है और values से कोई आर्ग्युमेंट नहीं मिला है, तो आगे की सभी प्रोसेस बंद हो जाएंगी और कमांड लाइन में कोई बदलाव नहीं होगा. अगर यह वैल्यू 'गलत है' पर सेट है, तो आर्ग्युमेंट का नाम और terminate_with (अगर दिया गया है) अब भी जोड़ा जाएगा. भले ही, अन्य आर्ग्युमेंट मौजूद हों या न हों.
|
uniquify
|
bool;
डिफ़ॉल्ट तौर पर Falseहै अगर यह 'सही' है, तो values से मिले डुप्लीकेट आर्ग्युमेंट हटा दिए जाएंगे. हर आर्ग्युमेंट का सिर्फ़ पहला उदाहरण दिखेगा. आम तौर पर, इस सुविधा की ज़रूरत नहीं होती, क्योंकि depsets पहले से ही डुप्लीकेट आइटम हटा देते हैं. हालांकि, अगर map_each कई आइटम के लिए एक ही स्ट्रिंग दिखाता है, तो यह सुविधा काम की हो सकती है.
|
expand_directories
|
bool;
डिफ़ॉल्ट तौर पर Trueहै अगर यह 'सही' है, तो values में मौजूद सभी डायरेक्ट्री को फ़ाइलों की फ़्लैट सूची में बड़ा किया जाएगा. ऐसा map_each लागू होने से पहले होता है.
|
terminate_with
|
string या None;
डिफ़ॉल्ट तौर पर Noneहोता है यह एक ज़रूरी नहीं है. इसका इस्तेमाल, अन्य सभी आर्ग्युमेंट के बाद जोड़ने के लिए किया जाता है. अगर omit_if_empty की वैल्यू 'सही है' (डिफ़ॉल्ट वैल्यू) और कोई अन्य आइटम नहीं जोड़ा गया है, तो इस तर्क को नहीं जोड़ा जाएगा. ऐसा तब होता है, जब values खाली हो या उसके सभी आइटम फ़िल्टर किए गए हों.
|
allow_closure
|
bool;
डिफ़ॉल्ट तौर पर 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
|
string;
ज़रूरी है यह एक डिलिमिटर स्ट्रिंग है. इसका इस्तेमाल 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
|
bool;
डिफ़ॉल्ट वैल्यू Trueहै अगर यह वैल्यू सही है, तो values खाली होने या इसके सभी आइटम फ़िल्टर किए जाने की वजह से, अगर जोड़ने के लिए कोई स्ट्रिंग नहीं है, तो आगे की सभी प्रोसेसिंग बंद कर दी जाएगी और कमांड लाइन में कोई बदलाव नहीं होगा. अगर यह विकल्प गलत है, तो दो आर्ग्युमेंट जोड़े जाएंगे. भले ही, जोड़ने के लिए कोई स्ट्रिंग न हो. पहला आर्ग्युमेंट, आर्ग्युमेंट का नाम होगा. इसके बाद, एक खाली स्ट्रिंग जोड़ी जाएगी. यह खाली स्ट्रिंग, शून्य स्ट्रिंग का लॉजिकल जॉइन है.
|
uniquify
|
bool;
डिफ़ॉल्ट रूप से Falseहोता है यह add_all के लिए इस्तेमाल किए जाने वाले फ़्लैग जैसा ही है.
|
expand_directories
|
bool;
डिफ़ॉल्ट रूप से Trueहोता है यह add_all के लिए इस्तेमाल किए जाने वाले फ़्लैग जैसा ही है.
|
allow_closure
|
bool;
डिफ़ॉल्ट रूप से Falseहोता है यह add_all के लिए इस्तेमाल किए जाने वाले फ़्लैग जैसा ही है.
|
set_param_file_format
Args Args.set_param_file_format(format)
पैरामीटर
| पैरामीटर | ब्यौरा |
|---|---|
format
|
string;
ज़रूरी है इनमें से कोई एक होना चाहिए:
अगर इसे कॉल नहीं किया जाता है, तो फ़ॉर्मैट डिफ़ॉल्ट रूप से "शेल" पर सेट होता है. |
use_param_file
Args Args.use_param_file(param_file_arg, *, use_always=False)
Bazel, बेहतर परफ़ॉर्मेंस के लिए, एक्ज़ीक्यूशन के दौरान आउटपुट ट्री में params फ़ाइल को न लिखने का विकल्प चुन सकता है. अगर आपको कार्रवाइयों को डीबग करना है और पैरामीटर फ़ाइल की जांच करनी है, तो अपने बिल्ड में --materialize_param_files पास करें.
पैरामीटर
| पैरामीटर | ब्यौरा |
|---|---|
param_file_arg
|
string;
required यह एक फ़ॉर्मैट स्ट्रिंग है, जिसमें सिर्फ़ एक "%s" होता है. अगर आर्ग्युमेंट को params फ़ाइल में स्पिल किया जाता है, तो उन्हें इस स्ट्रिंग वाले आर्ग्युमेंट से बदल दिया जाता है. इस स्ट्रिंग को params फ़ाइल के पाथ के साथ फ़ॉर्मैट किया जाता है. उदाहरण के लिए, अगर आर्ग्युमेंट को "params.txt" नाम की फ़ाइल में सेव किया जाता है, तो "--file=%s" को तय करने से, कार्रवाई की कमांड लाइन में "--file=params.txt" शामिल हो जाएगा. |
use_always
|
bool;
डिफ़ॉल्ट रूप से Falseहोता है क्या हमेशा पैरामीटर फ़ाइल में आर्ग्युमेंट स्पिल करने हैं. अगर यह वैल्यू 'गलत है', तो Bazel यह तय करेगा कि आपके सिस्टम और आर्ग्युमेंट की लंबाई के आधार पर, आर्ग्युमेंट को स्पिल करने की ज़रूरत है या नहीं. |