Bazel ยอมรับตัวเลือกมากมาย ตัวเลือกบางอย่างมีการเปลี่ยนแปลงบ่อยครั้ง (เช่น --subcommands) ในขณะที่ตัวเลือกอื่นๆ ยังคงเหมือนเดิมในบิลด์หลายรายการ (เช่น --package_path) หากต้องการหลีกเลี่ยงการระบุตัวเลือกที่ไม่มีการเปลี่ยนแปลงเหล่านี้สำหรับทุกบิลด์ (และคำสั่งอื่นๆ) คุณสามารถระบุตัวเลือกในไฟล์การกำหนดค่าที่เรียกว่า .bazelrc ได้
ไฟล์ .bazelrc อยู่ที่ไหน
Bazel จะค้นหาไฟล์การกำหนดค่าที่ไม่บังคับในตำแหน่งต่อไปนี้ตามลำดับที่แสดงด้านล่าง ระบบจะตีความตัวเลือกตามลำดับนี้ ดังนั้นตัวเลือกในไฟล์ที่อยู่ภายหลังจึงสามารถลบล้างค่าจากไฟล์ก่อนหน้าได้หากเกิดความขัดแย้ง ตัวเลือกทั้งหมดที่ควบคุมการโหลดไฟล์เหล่านี้เป็นตัวเลือกการเริ่มต้น ซึ่งหมายความว่าตัวเลือกเหล่านี้ต้องปรากฏหลัง bazel และก่อนคำสั่ง (build, test และอื่นๆ)
ไฟล์ RC ของระบบ เว้นแต่จะมี
--nosystem_rcเส้นทาง:
- ใน Linux/macOS/Unix:
/etc/bazel.bazelrc - ใน Windows:
%ProgramData%\bazel.bazelrc
หากไม่มีไฟล์นี้ ระบบจะไม่แสดงข้อผิดพลาด
หากต้องการตำแหน่งอื่นที่ระบบระบุไว้ คุณต้องสร้างไบนารี Bazel ที่กำหนดเอง โดยลบล้างค่า
BAZEL_SYSTEM_BAZELRC_PATHใน//src/main/cpp:option_processorตำแหน่งที่ระบบระบุไว้อาจมีการอ้างอิงตัวแปรสภาพแวดล้อม เช่น${VAR_NAME}ใน Unix หรือ%VAR_NAME%ใน Windows- ใน Linux/macOS/Unix:
ไฟล์ RC ของพื้นที่ทำงาน เว้นแต่จะมี
--noworkspace_rcเส้นทาง:
.bazelrcในไดเรกทอรีพื้นที่ทำงาน (ข้างไฟล์WORKSPACEหลัก)หากไม่มีไฟล์นี้ ระบบจะไม่แสดงข้อผิดพลาด
ไฟล์ RC ของโฮม เว้นแต่จะมี
--nohome_rcเส้นทาง:
- ใน Linux/macOS/Unix:
$HOME/.bazelrc - ใน Windows:
%USERPROFILE%\.bazelrcหากมี หรือ%HOME%/.bazelrc
หากไม่มีไฟล์นี้ ระบบจะไม่แสดงข้อผิดพลาด
- ใน Linux/macOS/Unix:
ไฟล์ RC ที่ผู้ใช้ระบุ หากระบุด้วย
--bazelrc=fileแฟล็กนี้ไม่บังคับ แต่ก็ระบุได้หลายครั้งเช่นกัน
/dev/nullบ่งบอกว่าระบบจะไม่สนใจ--bazelrcทั้งหมดที่ตามมา ซึ่ง มีประโยชน์ในการปิดใช้การค้นหาไฟล์ rc ของผู้ใช้ เช่น ในบิลด์ที่เผยแพร่ตัวอย่างเช่น
--bazelrc=x.rc --bazelrc=y.rc --bazelrc=/dev/null --bazelrc=z.rc- ระบบจะอ่าน
x.rcและy.rc - ระบบจะไม่สนใจ
z.rcเนื่องจากมี/dev/nullก่อนหน้านี้
- ระบบจะอ่าน
นอกจากไฟล์การกำหนดค่าที่ไม่บังคับนี้แล้ว Bazel ยังค้นหาไฟล์ rc ส่วนกลางด้วย ดูรายละเอียดเพิ่มเติมได้ที่ส่วน bazelrc ส่วนกลาง
ไวยากรณ์และความหมายของ .bazelrc
เช่นเดียวกับไฟล์ "rc" ทั้งหมดของ UNIX ไฟล์ .bazelrc เป็นไฟล์ข้อความที่มีไวยากรณ์แบบบรรทัด ระบบจะไม่สนใจบรรทัดว่างและบรรทัดที่ขึ้นต้นด้วย # (ความคิดเห็น) แต่ละบรรทัดจะมีลำดับคำ ซึ่งจะมีการแยกโทเค็นตามกฎเดียวกันกับ Bourne Shell
การนำเข้า
บรรทัดที่ขึ้นต้นด้วย import หรือ try-import เป็นบรรทัดพิเศษ ใช้บรรทัดเหล่านี้เพื่อโหลด
ไฟล์ "rc" อื่นๆ หากต้องการระบุเส้นทางที่สัมพันธ์กับรูทของพื้นที่ทำงาน ให้เขียน import %workspace%/path/to/bazelrc
ความแตกต่างระหว่าง import กับ try-import คือ Bazel จะล้มเหลวหากไม่มีไฟล์ที่
import'ed (หรืออ่านไม่ได้) แต่จะไม่ล้มเหลวสำหรับไฟล์ที่ try-import'ed
ลำดับความสำคัญของการนำเข้า
- ตัวเลือกในไฟล์ที่นำเข้าจะมีลำดับความสำคัญเหนือกว่าตัวเลือกที่ระบุก่อนคำสั่งนำเข้า
- ตัวเลือกที่ระบุหลังคำสั่งนำเข้าจะมีลำดับความสำคัญเหนือกว่าตัวเลือกในไฟล์ที่นำเข้า
- ตัวเลือกในไฟล์ที่นำเข้าในภายหลังจะมีลำดับความสำคัญเหนือกว่าไฟล์ที่นำเข้าก่อนหน้านี้
ค่าเริ่มต้นของตัวเลือก
บรรทัดส่วนใหญ่ของ bazelrc จะกำหนดค่าเริ่มต้นของตัวเลือก คำแรกในแต่ละบรรทัดจะระบุเวลาที่ใช้ค่าเริ่มต้นเหล่านี้
startup: ตัวเลือกการเริ่มต้น ซึ่งจะอยู่ก่อนคำสั่ง และอธิบายไว้ ในbazel help startup_optionscommon: ตัวเลือกที่มีผลกับคำสั่ง Bazel ทั้งหมดcommand: คำสั่ง Bazel เช่นbuildหรือqueryที่ตัวเลือกมีผล ตัวเลือกเหล่านี้จะมีผลกับคำสั่งทั้งหมดที่รับค่าจากคำสั่งที่ระบุด้วย (เช่นtestรับค่าจากbuild)
คุณใช้บรรทัดเหล่านี้แต่ละบรรทัดได้มากกว่า 1 ครั้ง และระบบจะรวมอาร์กิวเมนต์ที่ตามหลังคำแรกเข้าด้วยกันราวกับว่าอาร์กิวเมนต์เหล่านั้นปรากฏในบรรทัดเดียว (ผู้ใช้ 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 เสมอ
เช่น หากไฟล์ 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(และมีความเฉพาะเจาะจงมากกว่า) ได้แก่test,run,clean,mobile-install,info,print_action,config,cqueryและaquery coverageรับค่าจากtest
- ทุกคำสั่งจะรับค่าจาก
ระบบจะแยกวิเคราะห์บรรทัด 2 บรรทัดที่ระบุตัวเลือกสำหรับคำสั่งเดียวกันที่มีความเฉพาะเจาะจงเท่ากันตามลำดับที่ปรากฏในไฟล์
เนื่องจากกฎลำดับความสำคัญนี้ไม่ตรงกับลำดับไฟล์ การจัดลำดับความสำคัญภายในไฟล์ rc จะช่วยให้อ่านง่ายขึ้น โดยเริ่มจากตัวเลือก
commonที่ด้านบน และจบด้วยคำสั่งที่เฉพาะเจาะจงที่สุดที่ด้านล่างของไฟล์ วิธีนี้จะทำให้ลำดับการอ่านตัวเลือกเหมือนกับลำดับการใช้ตัวเลือก ซึ่งเข้าใจง่ายกว่า
อาร์กิวเมนต์ที่ระบุในบรรทัดของไฟล์ rc อาจรวมถึงอาร์กิวเมนต์ที่ไม่ใช่ตัวเลือก เช่น ชื่อเป้าหมายบิลด์ เป็นต้น อาร์กิวเมนต์เหล่านี้ เช่นเดียวกับตัวเลือกที่ระบุในไฟล์เดียวกัน จะมีลำดับความสำคัญต่ำกว่าอาร์กิวเมนต์ที่อยู่ในบรรทัดคำสั่ง และจะนำหน้าเสมอในรายการอาร์กิวเมนต์ที่ไม่ใช่ตัวเลือกที่ชัดเจน
--config
นอกจากการตั้งค่าเริ่มต้นของตัวเลือกแล้ว คุณยังใช้ไฟล์ rc เพื่อจัดกลุ่มตัวเลือกและระบุคำย่อสำหรับการจัดกลุ่มทั่วไปได้ด้วย โดยการเพิ่มคำต่อท้าย :name ลงในคำสั่ง ระบบจะไม่สนใจตัวเลือกเหล่านี้โดยค่าเริ่มต้น แต่จะ
รวมตัวเลือกเหล่านี้ไว้เมื่อมีตัวเลือก --config=name ในบรรทัดคำสั่งหรือในไฟล์ .bazelrc แบบเรียกซ้ำ แม้แต่ภายใน
คำจำกัดความการกำหนดค่าอื่น ระบบจะขยายตัวเลือกที่ระบุโดย command:name สำหรับคำสั่งที่เกี่ยวข้องเท่านั้น ตามลำดับความสำคัญที่อธิบายไว้ข้างต้น
--config=foo จะขยายเป็นตัวเลือกที่กำหนดไว้ใน
ไฟล์ rc "ในตำแหน่ง" เพื่อให้ตัวเลือก
ที่ระบุสำหรับการกำหนดค่ามีลำดับความสำคัญเดียวกับที่ตัวเลือก --config=foo
มี
ไวยากรณ์นี้ใช้ไม่ได้กับการใช้ startup เพื่อตั้งค่า
ตัวเลือกการเริ่มต้น ระบบจะไม่สนใจการตั้งค่า startup:config-name --some_startup_option ใน .bazelrc
ตัวอย่าง
ตัวอย่างไฟล์ ~/.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 ละเว้น โดยเพิ่มไดเรกทอรีละ 1 บรรทัด รายการจะสัมพันธ์กับรูทของพื้นที่ทำงาน
ไฟล์ bazelrc ส่วนกลาง
Bazel จะอ่านไฟล์ bazelrc ที่ไม่บังคับตามลำดับต่อไปนี้:
- ไฟล์ rc ของระบบที่อยู่ใน etc/bazel.bazelrc
- ไฟล์ rc ของพื้นที่ทำงานที่อยู่ใน $workspace/tools/bazel.rc
- ไฟล์ rc ของโฮมที่อยู่ใน $HOME/.bazelrc
ไฟล์ bazelrc แต่ละไฟล์ที่ระบุไว้ที่นี่จะมีแฟล็กที่เกี่ยวข้องซึ่งใช้เพื่อปิดใช้ไฟล์เหล่านั้นได้ (เช่น --nosystem_rc, --noworkspace_rc, --nohome_rc) นอกจากนี้ คุณยังทำให้ Bazel ละเว้น bazelrc ทั้งหมดได้โดยส่งตัวเลือกการเริ่มต้น --ignore_all_rc_files