Bazel में कई विकल्प इस्तेमाल किए जा सकते हैं. कुछ विकल्पों में अक्सर बदलाव होता है (उदाहरण के लिए,
--subcommands), जबकि अन्य विकल्प कई बिल्ड में एक जैसे रहते हैं (जैसे,
--package_path). हर बिल्ड (और अन्य निर्देशों) के लिए, इन विकल्पों को बताने से बचने के लिए, .bazelrc नाम की कॉन्फ़िगरेशन फ़ाइल में विकल्पों की जानकारी दी जा सकती है.
.bazelrc फ़ाइलें कहां हैं?
Bazel, वैकल्पिक कॉन्फ़िगरेशन फ़ाइलों को यहां दी गई जगहों पर, यहां दिए गए क्रम में खोजता है. विकल्पों को इस क्रम में समझा जाता है, ताकि किसी विवाद की स्थिति में, बाद की फ़ाइलों के विकल्प, पिछली फ़ाइल की वैल्यू को बदल सकें. इनमें से कौनसी फ़ाइलें लोड होंगी, यह कंट्रोल करने वाले सभी विकल्प, स्टार्टअप विकल्प होते हैं. इसका मतलब है कि ये bazel के बाद और कमांड (build, test वगैरह) से पहले होने चाहिए.
सिस्टम की आरसी फ़ाइल, बशर्ते
--nosystem_rcमौजूद न हो.पाथ:
- Linux/macOS/Unix पर:
/etc/bazel.bazelrc - Windows पर:
%ProgramData%\bazel.bazelrc
अगर यह फ़ाइल मौजूद नहीं है, तो यह कोई गड़बड़ी नहीं है.
अगर आपको सिस्टम की बताई गई किसी अन्य जगह की ज़रूरत है, तो आपको
//src/main/cpp:option_processorमेंBAZEL_SYSTEM_BAZELRC_PATHवैल्यू को बदलकर, कस्टम Bazel बाइनरी बनानी होगी. सिस्टम की तय की गई जगह में, एनवायरमेंट वैरिएबल के रेफ़रंस हो सकते हैं. जैसे, Unix पर${VAR_NAME}या Windows पर%VAR_NAME%.- Linux/macOS/Unix पर:
फ़ाइल फ़ोल्डर की आरसी फ़ाइल, बशर्ते
--noworkspace_rcमौजूद न हो.पाथ: आपकी फ़ाइल फ़ोल्डर डायरेक्ट्री में
.bazelrc(मुख्यMODULE.bazelफ़ाइल के बगल में).अगर यह फ़ाइल मौजूद नहीं है, तो यह कोई गड़बड़ी नहीं है.
होम की आरसी फ़ाइल, बशर्ते
--nohome_rcमौजूद न हो.पाथ:
- Linux/macOS/Unix पर:
$HOME/.bazelrc - Windows पर:
%USERPROFILE%\.bazelrcअगर मौजूद है या%HOME%/.bazelrc
अगर यह फ़ाइल मौजूद नहीं है, तो यह कोई गड़बड़ी नहीं है.
- Linux/macOS/Unix पर:
उपयोगकर्ता की बताई गई आरसी फ़ाइल, अगर
--bazelrc=fileके साथ बताई गई होयह फ़्लैग ज़रूरी नहीं है, लेकिन इसे एक से ज़्यादा बार भी इस्तेमाल किया जा सकता है.
/dev/nullसे पता चलता है कि इसके बाद के सभी--bazelrcको अनदेखा कर दिया जाएगा. यह जानकारी, रिलीज़ बाइड में उपयोगकर्ता की rc फ़ाइल को खोजने की सुविधा को बंद करने के लिए काम की है.उदाहरण के लिए:
--bazelrc=x.rc --bazelrc=y.rc --bazelrc=/dev/null --bazelrc=z.rcx.rcऔरy.rcपढ़े गए हैं.- पहले से मौजूद
/dev/nullकी वजह से,z.rcको अनदेखा किया जाता है.
इस वैकल्पिक कॉन्फ़िगरेशन फ़ाइल के अलावा, Bazel एक ग्लोबल rc फ़ाइल खोजता है. ज़्यादा जानकारी के लिए, global bazelrc सेक्शन देखें.
.bazelrc सिंटैक्स और सिमेंटिक्स
सभी UNIX "rc" फ़ाइलों की तरह, .bazelrc फ़ाइल भी एक टेक्स्ट फ़ाइल होती है. इसमें लाइन के आधार पर ग्रैमर का इस्तेमाल किया जाता है. खाली लाइनों और # (टिप्पणियों) से शुरू होने वाली लाइनों को अनदेखा किया जाता है. हर लाइन में शब्दों का क्रम होता है. इन्हें Bourne shell के नियमों के मुताबिक टोकन में बदला जाता है.
आयात
import या try-import से शुरू होने वाली लाइनें खास होती हैं: इनका इस्तेमाल, अन्य "rc" फ़ाइलों को लोड करने के लिए करें. वर्कस्पेस के रूट से जुड़ा पाथ तय करने के लिए, import %workspace%/path/to/bazelrc लिखें.
import और try-import के बीच का अंतर यह है कि अगर import वाली फ़ाइल मौजूद नहीं है (या उसे पढ़ा नहीं जा सकता), तो Bazel काम नहीं करता. हालांकि, try-import वाली फ़ाइल के लिए ऐसा नहीं होता.
इंपोर्ट की प्राथमिकता:
- इंपोर्ट की गई फ़ाइल में मौजूद विकल्प, इंपोर्ट स्टेटमेंट से पहले बताए गए विकल्पों से ज़्यादा प्राथमिकता पाते हैं.
- इंपोर्ट स्टेटमेंट के बाद बताए गए विकल्प, इंपोर्ट की गई फ़ाइल के विकल्पों से ज़्यादा अहम होते हैं.
- बाद में इंपोर्ट की गई फ़ाइलों के विकल्प, पहले इंपोर्ट की गई फ़ाइलों के विकल्पों से ज़्यादा प्राथमिकता पाते हैं.
डिफ़ॉल्ट विकल्प
bazelrc की ज़्यादातर लाइनें, विकल्प की डिफ़ॉल्ट वैल्यू तय करती हैं. हर लाइन के पहले शब्द से पता चलता है कि ये डिफ़ॉल्ट वैल्यू कब लागू होती हैं:
startup: स्टार्टअप के विकल्प, जो कमांड से पहले आते हैं और जिनके बारे मेंbazel help startup_optionsमें बताया गया है.common: ऐसे विकल्प जिन्हें उन सभी Bazel निर्देशों पर लागू किया जाना चाहिए जिनमें ये काम करते हैं. अगर कोई निर्देश इस तरह से बताए गए विकल्प के साथ काम नहीं करता है, तो विकल्प को तब तक अनदेखा कर दिया जाता है, जब तक वह किसी अन्य Bazel निर्देश के लिए मान्य है. ध्यान दें कि यह सिर्फ़ विकल्प के नाम पर लागू होता है: अगर मौजूदा निर्देश, तय किए गए नाम वाले विकल्प को स्वीकार करता है, लेकिन तय की गई वैल्यू के साथ काम नहीं करता, तो यह निर्देश काम नहीं करेगा.always: ऐसे विकल्प जो Bazel के सभी निर्देशों पर लागू होते हैं. अगर कोई निर्देश, इस तरह से बताए गए विकल्प के साथ काम नहीं करता है, तो वह काम नहीं करेगा.command: Bazel कमांड, जैसे किbuildयाquery, जिस पर विकल्प लागू होते हैं. ये विकल्प, बताए गए कमांड से इनहेरिट होने वाले सभी कमांड पर भी लागू होते हैं. उदाहरण के लिए,test,buildसे इनहेरिट करता है.
इनमें से हर लाइन का इस्तेमाल एक से ज़्यादा बार किया जा सकता है. साथ ही, पहले शब्द के बाद मौजूद आर्ग्युमेंट को इस तरह जोड़ा जाता है जैसे कि वे एक ही लाइन में मौजूद हों. (CVS के उपयोगकर्ताओं को, "स्विज़र आर्मी नाइफ़" कमांड-लाइन इंटरफ़ेस वाला एक और टूल मिलेगा. इसमें सिंटैक्स, .cvsrc जैसा ही होगा.) उदाहरण के लिए, ये लाइनें:
build --test_tmpdir=/tmp/foo --verbose_failuresbuild --test_tmpdir=/tmp/bar
को इस तरह जोड़ा जाता है:
build --test_tmpdir=/tmp/foo --verbose_failures --test_tmpdir=/tmp/barइसलिए, असरदार फ़्लैग --verbose_failures और --test_tmpdir=/tmp/bar हैं.
विकल्प की प्राथमिकता:
- कमांड लाइन के विकल्प, आरसी फ़ाइलों के विकल्पों से हमेशा प्राथमिकता पाते हैं.
उदाहरण के लिए, अगर कोई rc फ़ाइल
build -c optदिखाती है, लेकिन कमांड लाइन फ़्लैग-c dbgहै, तो कमांड लाइन फ़्लैग को प्राथमिकता दी जाती है. rc फ़ाइल में, प्राथमिकता तय करने के लिए यह देखा जाता है कि कमांड कितना सटीक है: ज़्यादा सटीक कमांड की लाइनें, कम सटीक कमांड की लाइनों से पहले लागू होती हैं.
खास जानकारी, इनहेरिटेंस से तय होती है. कुछ कमांड, दूसरे कमांड से विकल्पों को इनहेरिट करते हैं. इससे, इनहेरिट करने वाला कमांड, मूल कमांड से ज़्यादा खास हो जाता है. उदाहरण के लिए,
test,buildकमांड से इनहेरिट करता है. इसलिए, सभीbazel buildफ़्लैगbazel testके लिए मान्य होते हैं. साथ ही, सभीbuildलाइनेंbazel testपर भी लागू होती हैं. ऐसा तब तक होता है, जब तक उसी विकल्प के लिएtestलाइन मौजूद न हो. अगर rc फ़ाइल में यह जानकारी दिखती है:test -c dbg --test_env=PATHbuild -c opt --verbose_failuresतो
bazel build //foo,-c opt --verbose_failuresका इस्तेमाल करेगा औरbazel test //foo,--verbose_failures -c dbg --test_env=PATHका इस्तेमाल करेगा.इनहेरिटेंस (खास जानकारी) ग्राफ़:
- हर कमांड को
commonसे इनहेरिट किया जाता है - ये निर्देश,
buildसे इनहेरिट किए जाते हैं और इनमेंbuildसे ज़्यादा जानकारी होती है:test,run,clean,mobile-install,info,print_action,config,cquery, औरaquery coverage,fetch, औरvendorकोtestसे इनहेरिट किया गया
- हर कमांड को
एक ही कमांड के विकल्पों की जानकारी देने वाली दो पंक्तियों को, उसी क्रम में पार्स किया जाता है जिस क्रम में वे फ़ाइल में दिखती हैं.
प्राथमिकता का यह नियम, फ़ाइल के क्रम से मेल नहीं खाता. इसलिए, rc फ़ाइलों में प्राथमिकता के क्रम का पालन करने से, उन्हें पढ़ने में आसानी होती है: सबसे ऊपर
commonविकल्पों से शुरू करें और फ़ाइल के सबसे नीचे सबसे खास निर्देशों के साथ खत्म करें. इस तरह, विकल्पों को पढ़ने का क्रम और लागू करने का क्रम एक ही होता है. यह क्रम, समझने में आसान होता है.
किसी आरसी फ़ाइल की लाइन में दिए गए आर्ग्युमेंट में, ऐसे आर्ग्युमेंट शामिल हो सकते हैं जो विकल्प नहीं हैं. जैसे, बिल्ड टारगेट के नाम वगैरह. इनका क्रम, कमांड-लाइन पर मौजूद उनके भाई-बहनों के मुकाबले कम होता है. ये ठीक उसी तरह होते हैं जैसे एक ही फ़ाइल में बताए गए विकल्प. साथ ही, इन्हें हमेशा विकल्प के अलावा अन्य आर्ग्युमेंट की साफ़ तौर पर बताई गई सूची में पहले रखा जाता है.
--config
विकल्पों के डिफ़ॉल्ट तौर पर सेट होने के अलावा, rc फ़ाइल का इस्तेमाल विकल्पों को ग्रुप करने के लिए किया जा सकता है. साथ ही, सामान्य ग्रुपिंग के लिए शॉर्टहैंड भी दिया जा सकता है. ऐसा करने के लिए, कमांड में :name
सर्फ़िक्स जोड़ें. इन विकल्पों को डिफ़ॉल्ट रूप से अनदेखा किया जाता है. हालांकि, जब कमांड लाइन या .bazelrc फ़ाइल में --config=name विकल्प मौजूद होगा, तब इन्हें शामिल किया जाएगा. यह विकल्प, किसी अन्य कॉन्फ़िगरेशन की परिभाषा में भी बार-बार शामिल किया जाएगा. command:name से तय किए गए विकल्प, सिर्फ़ लागू निर्देशों के लिए, ऊपर बताए गए प्राथमिकता क्रम में ही दिखाए जाएंगे.
--config=foo, rc फ़ाइलों में "जगह पर" तय किए गए विकल्पों में बड़ा हो जाता है, ताकि कॉन्फ़िगरेशन के लिए तय किए गए विकल्पों की प्राथमिकता वही हो जो --config=foo विकल्प की थी.
यह सिंटैक्स, स्टार्टअप विकल्प सेट करने के लिए startup के इस्तेमाल पर लागू नहीं होता. .bazelrc में startup:config-name --some_startup_option को सेट करने पर, उसे अनदेखा कर दिया जाएगा.
--enable_platform_specific_config
.bazelrc में, प्लैटफ़ॉर्म के हिसाब से कॉन्फ़िगरेशन को --enable_platform_specific_config का इस्तेमाल करके अपने-आप चालू किया जा सकता है. उदाहरण के लिए, अगर होस्ट ओएस Linux है और build कमांड चलाया जाता है, तो build:linux कॉन्फ़िगरेशन अपने-आप चालू हो जाएगा. ओएस के आइडेंटिफ़ायर के तौर पर linux, macos, windows,
freebsd, और openbsd का इस्तेमाल किया जा सकता है. इस फ़्लैग को चालू करना, Linux पर --config=linux, Windows पर --config=windows वगैरह का इस्तेमाल करने के बराबर है.
--enable_platform_specific_config देखें.
उदाहरण
यहां ~/.bazelrc फ़ाइल का एक उदाहरण दिया गया है:
# Bob's Bazel option defaults
startup --host_jvm_args=-XX:-UseParallelGC
import /home/bobs_project/bazelrc
build --show_timestamps --keep_going --jobs 600
build --color=yes
query --keep_going
# Definition of --config=memcheck
build:memcheck --strip=never --test_timeout=3600
Bazel के काम करने के तरीके को कंट्रोल करने वाली अन्य फ़ाइलें
.bazelignore
Workspace में ऐसी डायरेक्ट्री तय की जा सकती हैं जिनमें Bazel को अनदेखा करना है. जैसे, दूसरे बिल्ड सिस्टम का इस्तेमाल करने वाले मिलते-जुलते प्रोजेक्ट. Workspace के रूट में .bazelignore नाम की एक फ़ाइल डालें. साथ ही, उन डायरेक्ट्री को जोड़ें जिन्हें आपको Bazel को अनदेखा करने के लिए कहना है. हर डायरेक्ट्री को एक लाइन में जोड़ें. एंट्री, फ़ाइल फ़ोल्डर के रूट से जुड़ी होती हैं.
ग्लोबल bazelrc फ़ाइल
Bazel, वैकल्पिक bazelrc फ़ाइलों को इस क्रम में पढ़ता है:
- सिस्टम की rc-फ़ाइल,
etc/bazel.bazelrcपर मौजूद है. $workspace/tools/bazel.rcपर मौजूद फ़ाइल फ़ोल्डर की rc-फ़ाइल.- होम आरसी-फ़ाइल,
$HOME/.bazelrcपर मौजूद है
यहां दी गई हर bazelrc फ़ाइल के लिए एक फ़्लैग होता है.इसका इस्तेमाल, फ़ाइलों को बंद करने के लिए किया जा सकता है. जैसे, --nosystem_rc, --noworkspace_rc, --nohome_rc. --ignore_all_rc_files स्टार्टअप विकल्प को पास करके, Bazel को सभी bazelrc फ़ाइलों को अनदेखा करने के लिए भी कहा जा सकता है.