Bazel कई विकल्प स्वीकार करता है. कुछ विकल्प अक्सर अलग-अलग होते हैं (उदाहरण के लिए,
--subcommands
), जबकि अन्य कई बिल्ड (जैसे कि
--package_path
) में एक जैसे ही रहते हैं. हर बिल्ड (और दूसरे निर्देशों) के लिए, बदले गए इन विकल्पों को तय करने से बचने के लिए, कॉन्फ़िगरेशन फ़ाइल में विकल्प तय करें
.bazelrc
.
.bazelrc
फ़ाइलें कहां हैं?
Bazel नीचे दिए गए क्रम में, नीचे दी गई जगहों में वैकल्पिक कॉन्फ़िगरेशन फ़ाइलें ढूंढता है. विकल्पों की जानकारी इसी क्रम में दी जाती है, इसलिए विवाद की स्थिति में, बाद की फ़ाइलों के विकल्प, किसी पुरानी फ़ाइल की वैल्यू को बदल सकते हैं. ऐसे सभी विकल्प जो यह कंट्रोल करते हैं कि इनमें से कौनसी फ़ाइलें लोड हों, शुरू करने के विकल्प हैं. इसका मतलब है कि ये विकल्प bazel
के बाद और निर्देश (build
, test
वगैरह) से पहले आने चाहिए.
सिस्टम की आरसी फ़ाइल, अगर
--nosystem_rc
मौजूद न हो.पथ:
- Linux/macOS/Unixes पर:
/etc/bazel.bazelrc
- Windows पर:
%ProgramData%\bazel.bazelrc
अगर यह फ़ाइल मौजूद नहीं है, तो यह कोई गड़बड़ी नहीं है.
अगर सिस्टम के हिसाब से किसी दूसरी जगह की जानकारी देना ज़रूरी है, तो आपको
//src/main/cpp:option_processor
मेंBAZEL_SYSTEM_BAZELRC_PATH
वैल्यू को बदलकर, कस्टम बेज़ल बाइनरी बनानी होगी. सिस्टम की बताई गई जगह में एनवायरमेंट वैरिएबल रेफ़रंस हो सकते हैं, जैसे कि Unix पर${VAR_NAME}
या Windows पर%VAR_NAME%
.- Linux/macOS/Unixes पर:
फ़ाइल फ़ोल्डर की आरसी फ़ाइल, जब तक कि
--noworkspace_rc
मौजूद न हो.पाथ: आपकी फ़ाइल फ़ोल्डर की डायरेक्ट्री में
.bazelrc
(मुख्यWORKSPACE
फ़ाइल के बगल में).अगर यह फ़ाइल मौजूद नहीं है, तो यह कोई गड़बड़ी नहीं है.
अगर
--nohome_rc
मौजूद नहीं है, तो होम की आरसी फ़ाइल.पथ:
- Linux/macOS/Unixes पर:
$HOME/.bazelrc
- Windows पर: अगर मौजूद है, तो
%USERPROFILE%\.bazelrc
या%HOME%/.bazelrc
अगर यह फ़ाइल मौजूद नहीं है, तो यह कोई गड़बड़ी नहीं है.
- Linux/macOS/Unixes पर:
उपयोगकर्ता की बताई गई आरसी फ़ाइल, अगर
--bazelrc=file
में बताई गई होयह फ़्लैग ज़रूरी नहीं है, लेकिन इसे एक से ज़्यादा बार भी दर्ज किया जा सकता है.
/dev/null
बताता है कि आगे के सभी--bazelrc
को अनदेखा कर दिया जाएगा. इसकी मदद से, किसी उपयोगकर्ता की आरसी फ़ाइल को खोजने की सुविधा बंद की जा सकती है, जैसे कि रिलीज़ बिल्ड.उदाहरण के लिए:
--bazelrc=x.rc --bazelrc=y.rc --bazelrc=/dev/null --bazelrc=z.rc
x.rc
औरy.rc
पढ़े गए हैं.- पिछले
/dev/null
की वजह सेz.rc
को अनदेखा कर दिया गया है.
इस वैकल्पिक कॉन्फ़िगरेशन फ़ाइल के अलावा, Bazel एक ग्लोबल आरसी फ़ाइल ढूंढता है. ज़्यादा जानकारी के लिए, ग्लोबल bazelrc सेक्शन देखें.
.bazelrc
सिंटैक्स और सिमैंटिक
सभी UNIX "rc" फ़ाइलों की तरह, .bazelrc
फ़ाइल भी लाइन-आधारित व्याकरण वाली टेक्स्ट फ़ाइल होती है. #
(टिप्पणियां) से शुरू होने वाली खाली लाइनों और लाइनों को अनदेखा कर दिया जाता है. हर लाइन में शब्दों का एक क्रम होता है, जो बॉर्न शेल जैसे नियमों के मुताबिक टोकन बनाया जाता है.
इंपोर्ट
import
या try-import
से शुरू होने वाली लाइनें खास होती हैं: इनका इस्तेमाल अन्य "rc" फ़ाइलों को लोड करने के लिए करें. फ़ाइल फ़ोल्डर रूट से मिलता-जुलता पाथ बताने के लिए,
import %workspace%/path/to/bazelrc
लिखें.
import
और try-import
में यह अंतर है कि अगर import
की फ़ाइल मौजूद नहीं है (या उसे पढ़ा नहीं जा सकता), तो Bazel काम नहीं करता है. हालांकि, try-import
की फ़ाइल में ऐसा नहीं होता है.
इंपोर्ट करने का क्रम:
- इंपोर्ट की गई फ़ाइल के विकल्पों को, इंपोर्ट स्टेटमेंट से पहले तय किए गए विकल्पों के मुकाबले प्राथमिकता दी जाती है.
- इंपोर्ट स्टेटमेंट के बाद दिए गए विकल्पों को, इंपोर्ट की गई फ़ाइल में मौजूद विकल्पों के मुकाबले प्राथमिकता दी जाती है.
- पहले इंपोर्ट की गई फ़ाइलों के मुकाबले, बाद में इंपोर्ट की गई फ़ाइलों के विकल्पों को प्राथमिकता दी जाती है.
विकल्प डिफ़ॉल्ट
bazelrc की ज़्यादातर लाइनें, डिफ़ॉल्ट विकल्प की वैल्यू तय करती हैं. हर लाइन का पहला शब्द बताता है कि ये डिफ़ॉल्ट कब लागू होते हैं:
startup
: शुरू करने के विकल्प, जो निर्देश से पहले जाते हैं और जिनके बारे मेंbazel help startup_options
में बताया गया है.common
: ऐसे विकल्प जो सभी Bazel कमांड पर लागू होते हैं.command
: Bazel कमांड, जैसे किbuild
याquery
जिस पर विकल्प लागू होते हैं. ये विकल्प उन सभी कमांड पर भी लागू होते हैं जो बताए गए कमांड से जुड़े होते हैं. (उदाहरण के लिए,test
कोbuild
से इनहेरिट किया जाता है.)
इनमें से हर लाइन को एक से ज़्यादा बार इस्तेमाल किया जा सकता है और पहले शब्द के बाद आने वाले सभी तर्क ऐसे जोड़े जाते हैं जैसे वे एक ही लाइन में दिख रहे हों. ("स्विस आर्मी नाइफ़" कमांड-लाइन इंटरफ़ेस वाला एक और टूल, CVS के उपयोगकर्ता .cvsrc
के जैसा सिंटैक्स खोजेंगे.) उदाहरण के लिए, लाइनें:
build --test_tmpdir=/tmp/foo --verbose_failures
build --test_tmpdir=/tmp/bar
इस तरह जोड़े जाते हैं:
build --test_tmpdir=/tmp/foo --verbose_failures --test_tmpdir=/tmp/bar
इसलिए, --verbose_failures
और --test_tmpdir=/tmp/bar
असरदार फ़्लैग हैं.
विकल्प की प्राथमिकता:
- कमांड लाइन के विकल्पों को हमेशा आरसी फ़ाइलों में मौजूद विकल्पों के मुकाबले प्राथमिकता दी जाती है.
उदाहरण के लिए, अगर आरसी फ़ाइल में
build -c opt
है, लेकिन कमांड लाइन फ़्लैग-c dbg
है, तो कमांड लाइन फ़्लैग को प्राथमिकता दी जाएगी. आरसी फ़ाइल में, प्राथमिकता को खास तौर पर तय किया जाता है: ज़्यादा खास कमांड की लाइनों को, कम खास कमांड की लाइनों की तुलना में प्राथमिकता दी जाती है.
विशेषता को इनहेरिटेंस के हिसाब से तय किया जाता है. कुछ निर्देश, दूसरे कमांड से विकल्प इनहेरिट करते हैं, जिससे इनहेरिट करने वाला कमांड, बेस कमांड से ज़्यादा सटीक हो जाता है. उदाहरण के लिए,
test
कोbuild
कमांड से इनहेरिट किया जाता है. इसलिए, सभीbazel build
फ़्लैग,bazel test
के लिए मान्य होंगे. साथ ही, सभीbuild
लाइनें तब तकbazel test
पर भी लागू होंगी, जब तक एक ही विकल्प के लिएtest
लाइन न हो. अगर आरसी फ़ाइल में यह जानकारी दिखती है:test -c dbg --test_env=PATH
build -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
कोtest
से इनहेरिट किया जाता है
- हर निर्देश
एक ही कमांड के लिए, बराबर विकल्प के विकल्प तय करने वाली दो लाइनें, उस क्रम में पार्स की जाती हैं जिस क्रम में वे फ़ाइल में दिखती हैं.
प्राथमिकता का यह नियम, फ़ाइल के क्रम से मेल नहीं खाता है. इसलिए, अगर आप आरसी फ़ाइलों में प्राथमिकता के क्रम को फ़ॉलो करते हैं, तो यह पढ़ने में मदद करता है: सबसे ऊपर
common
विकल्पों से शुरू करें और फ़ाइल के नीचे सबसे खास निर्देशों के साथ खत्म करें. इस तरह से, विकल्पों को उसी क्रम में पढ़ा जाएगा जिस क्रम में उन्हें लागू किया जाएगा. यह ज़्यादा आसान होता है.
rc फ़ाइल की लाइन में दिए गए तर्कों में, ऐसे तर्क शामिल हो सकते हैं जो विकल्प नहीं होते. जैसे, बिल्ड टारगेट के नाम वगैरह. इन ही फ़ाइलों में बताए गए विकल्पों की तरह, इनकी भी कमांड लाइन पर प्रतिरूपों की तुलना में कम प्राथमिकता होती है. साथ ही, इन्हें हमेशा बिना विकल्प वाले तर्कों की साफ़ सूची से पहले जोड़ा जाता है.
--config
विकल्प को डिफ़ॉल्ट तौर पर सेट करने के अलावा, आरसी फ़ाइल का इस्तेमाल विकल्पों को ग्रुप करने और सामान्य ग्रुप के लिए शॉर्टहैंड मुहैया कराने के लिए किया जा सकता है. ऐसा करने के लिए, कमांड में :name
सफ़िक्स को जोड़ें. इन विकल्पों को डिफ़ॉल्ट रूप से अनदेखा किया जाता है. हालांकि, --config=name
विकल्प मौजूद होने पर, इन्हें कमांड लाइन या .bazelrc
फ़ाइल में बार-बार शामिल किया जाएगा. ऐसा किसी दूसरी कॉन्फ़िगरेशन परिभाषा में भी बार-बार किया जाएगा. command:name
के बताए गए विकल्पों को सिर्फ़ लागू निर्देशों के लिए, ऊपर बताए गए प्राथमिकता के क्रम में बड़ा किया जाएगा.
--config=foo
, आरसी फ़ाइलों "इन-प्लेस" में दिए गए विकल्पों के दायरे में आता है, ताकि कॉन्फ़िगरेशन के लिए बताए गए विकल्पों की प्राथमिकता वही हो जो --config=foo
विकल्प पर थी.
इस सिंटैक्स में स्टार्टअप के विकल्प सेट करने के लिए, startup
का इस्तेमाल नहीं किया जा सकता. .bazelrc में
startup:config-name --some_startup_option
सेटिंग को अनदेखा कर दिया जाएगा.
उदाहरण
यहां ~/.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
आप फ़ाइल फ़ोल्डर में ऐसी डायरेक्ट्री तय कर सकते हैं
जिन्हें Bazel अनदेखा करना चाहता है. जैसे कि
दूसरे बिल्ड सिस्टम का इस्तेमाल करने वाले मिलते-जुलते प्रोजेक्ट. .bazelignore
नाम की फ़ाइल को फ़ाइल फ़ोल्डर की रूट में रखें. साथ ही, उन डायरेक्ट्री को जोड़ें जिन्हें आप Bazel से अनदेखा कराना चाहते हैं. एक लाइन में एक ही डायरेक्ट्री जोड़ें. एंट्री, फ़ाइल फ़ोल्डर के रूट से जुड़ी होती हैं.
ग्लोबल bazelrc फ़ाइल
Bazel, वैकल्पिक bazelrc फ़ाइलों को इस क्रम में पढ़ता है:
- etc/bazel.bazelrc
पर मौजूद सिस्टम rc-file.
- Workspace की आरसी-फ़ाइल, $workspace/tools/bazel.rc
पर मौजूद है.
- होम की आरसी-फ़ाइल $HOME/.bazelrc
में स्थानीय है
यहां दी गई हर bazelrc फ़ाइल में, उससे जुड़ा एक फ़्लैग मौजूद है. इसे बंद करने के लिए इस्तेमाल किया जा सकता है (जैसे, --nosystem_rc
, --noworkspace_rc
, --nohome_rc
). --ignore_all_rc_files
स्टार्टअप विकल्प पास करके, Bazel को सभी bazelrcs अनदेखा किए जा सकते हैं.