Bazel ยอมรับตัวเลือกได้หลายรายการ ตัวเลือกบางรายการมีการเปลี่ยนแปลงบ่อย (เช่น --subcommands
) ขณะที่บางรายการยังคงเหมือนเดิมในหลายๆ บิลด์ (เช่น --package_path
) คุณระบุตัวเลือกในไฟล์การกำหนดค่าที่เรียกว่า .bazelrc
ได้เพื่อหลีกเลี่ยงการระบุตัวเลือกที่ไม่เปลี่ยนแปลงเหล่านี้สำหรับทุกบิลด์ (และคำสั่งอื่นๆ)
ไฟล์ .bazelrc
อยู่ที่ไหน
Bazel จะค้นหาไฟล์การกำหนดค่าที่ไม่บังคับในตำแหน่งต่อไปนี้ ตามลำดับที่แสดงด้านล่าง ระบบจะตีความตัวเลือกตามลําดับนี้ ดังนั้นตัวเลือกในไฟล์ที่ใหม่กว่าจะลบล้างค่าจากไฟล์ก่อนหน้าได้หากเกิดข้อขัดแย้ง ตัวเลือกทั้งหมดที่ควบคุมว่าระบบจะโหลดไฟล์เหล่านี้รายการใดบ้างคือตัวเลือกเริ่มต้น ซึ่งหมายความว่าจะต้องเกิดขึ้นหลังจาก bazel
และก่อนคำสั่ง (build
, test
ฯลฯ)
ไฟล์ RC ของระบบ ยกเว้น
--nosystem_rc
อยู่เส้นทาง:
- ใน Linux/macOS/Unixes:
/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/Unixes:
ไฟล์ RC ของพื้นที่ทำงาน เว้นแต่จะมี
--noworkspace_rc
เส้นทาง:
.bazelrc
ในไดเรกทอรีพื้นที่ทำงาน (ถัดจากไฟล์หลักWORKSPACE
)หากไม่มีไฟล์นี้ ก็จะไม่เป็นข้อผิดพลาด
ไฟล์ RC ของบ้าน ยกเว้น
--nohome_rc
อยู่เส้นทาง:
- ใน Linux/macOS/Unix:
$HOME/.bazelrc
- ใน Windows:
%USERPROFILE%\.bazelrc
หากมี หรือ%HOME%/.bazelrc
หากไม่มีไฟล์นี้ ก็จะไม่เป็นข้อผิดพลาด
- ใน Linux/macOS/Unix:
ไฟล์ RC ที่ผู้ใช้ระบุ หากระบุด้วย
--bazelrc=file
คุณจะใช้ Flag นี้หรือไม่ก็ได้ แต่ระบุได้หลายครั้ง
/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
ไวยากรณ์และความหมาย
ไฟล์ .bazelrc
เป็นไฟล์ข้อความที่มีไวยากรณ์ตามบรรทัด เช่นเดียวกับไฟล์ UNIX "rc" ทั้งหมด ระบบจะไม่สนใจบรรทัดว่างที่เริ่มต้นด้วย #
(ความคิดเห็น) โดยแต่ละบรรทัดจะมีลำดับคำ ซึ่งแปลงข้อมูลเป็นโทเค็นตามกฎเดียวกันกับเชลล์บอร์น
การนำเข้า
บรรทัดที่ขึ้นต้นด้วย import
หรือ try-import
จะเป็นบรรทัดพิเศษ: ใช้เพื่อโหลดไฟล์ "rc" อื่นๆ หากต้องการระบุเส้นทางที่สัมพันธ์กับรูทของพื้นที่ทำงาน ให้เขียน import %workspace%/path/to/bazelrc
ความแตกต่างระหว่าง import
กับ try-import
คือ Bazel จะดำเนินการไม่สำเร็จหากไม่มีไฟล์ import
(หรืออ่านไม่ได้) แต่จะไม่ดำเนินการไม่สำเร็จสำหรับไฟล์ try-import
ลำดับความสำคัญในการนำเข้า:
- ตัวเลือกในไฟล์ที่นำเข้าจะมีความสำคัญเหนือกว่าตัวเลือกที่ระบุก่อนคำสั่งนำเข้า
- ตัวเลือกที่ระบุไว้หลังคำสั่งการนําเข้าจะมีลําดับความสําคัญเหนือกว่าตัวเลือกในไฟล์ที่นําเข้า
- ตัวเลือกในไฟล์ที่นำเข้าในภายหลังจะมีผลเหนือกว่าไฟล์ที่นำเข้าก่อนหน้านี้
ค่าเริ่มต้นของตัวเลือก
บรรทัดส่วนใหญ่ของ bazelrc จะกำหนดค่าตัวเลือกเริ่มต้น คำแรกในแต่ละบรรทัดจะระบุเมื่อมีการนำค่าเริ่มต้นเหล่านี้ไปใช้
startup
: ตัวเลือกการเริ่มต้น ซึ่งอยู่ก่อนคำสั่งและอธิบายไว้ในbazel help startup_options
common
: ตัวเลือกที่ควรใช้กับคำสั่ง Bazel ทั้งหมดที่รองรับตัวเลือกดังกล่าว หากคำสั่งไม่รองรับตัวเลือกที่ระบุด้วยวิธีนี้ ระบบจะละเว้นตัวเลือกนี้ตราบใดที่ยังใช้ได้สำหรับคำสั่ง Bazel อื่นๆ บางคำสั่ง โปรดทราบว่าเงื่อนไขนี้มีผลกับชื่อตัวเลือกเท่านั้น กล่าวคือ หากคำสั่งปัจจุบันยอมรับตัวเลือกที่มีชื่อที่ระบุ แต่ไม่รองรับค่าที่ระบุ คำสั่งดังกล่าวจะดำเนินการไม่สำเร็จalways
: ตัวเลือกที่ใช้กับคำสั่ง Bazel ทั้งหมด หากคำสั่งไม่รองรับตัวเลือกที่ระบุด้วยวิธีนี้ จะทำให้ดำเนินการไม่สำเร็จcommand
: คำสั่ง Bazel เช่นbuild
หรือquery
ที่ตัวเลือกจะมีผล ตัวเลือกเหล่านี้มีผลกับคําสั่งทั้งหมดที่รับค่ามาจากคําสั่งที่ระบุด้วย (เช่นtest
จะรับค่าจากbuild
)
แต่ละบรรทัดอาจใช้มากกว่า 1 ครั้ง และอาร์กิวเมนต์ที่อยู่หลังคำแรกจะถูกรวมเข้าด้วยกันราวกับว่าปรากฏในบรรทัดเดียว (ผู้ใช้ CVS ซึ่งเป็นเครื่องมืออีกอย่างที่มีอินเทอร์เฟซบรรทัดคำสั่ง "Swiss Army Knife" จะพบว่าไวยากรณ์คล้ายกับของ .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
ลำดับความสำคัญของตัวเลือก:
- ตัวเลือกในบรรทัดคำสั่งจะมีลำดับความสำคัญเหนือกว่าตัวเลือกในไฟล์ rc เสมอ
เช่น หากไฟล์ rc แจ้งว่า
build -c opt
แต่แฟล็กบรรทัดคำสั่งคือ-c dbg
แฟล็กบรรทัดคำสั่งจะมีลำดับความสำคัญเหนือกว่า ภายในไฟล์ rc ลําดับความสําคัญจะขึ้นอยู่กับความเฉพาะเจาะจง โดยบรรทัดสําหรับคําสั่งที่เฉพาะเจาะจงมากกว่าจะมีลําดับความสําคัญเหนือบรรทัดสําหรับคําสั่งที่เฉพาะเจาะจงน้อยกว่า
ความเฉพาะเจาะจงจะกำหนดโดยการรับช่วง บางคำสั่งจะรับตัวเลือกมาจากคำสั่งอื่นๆ ทำให้คำสั่งการรับค่ามีความเฉพาะเจาะจงมากกว่าคำสั่งพื้นฐาน ตัวอย่างเช่น
test
จะรับค่าจากคําสั่งbuild
แฟล็กbazel build
ทั้งหมดจึงใช้ได้กับbazel test
และบรรทัดbuild
ทั้งหมดจะมีผลกับbazel test
ด้วย เว้นแต่จะมีบรรทัดtest
สําหรับตัวเลือกเดียวกัน หากไฟล์ rc แสดงข้อความว่า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
: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 ละเว้น โดยเพิ่มทีละไดเรกทอรีต่อบรรทัด รายการจะสัมพันธ์กับรูทของพื้นที่ทำงาน
ไฟล์ bazelrc ทั่วโลก
Bazel อ่านไฟล์ bazelrc ที่ไม่บังคับตามลำดับต่อไปนี้
- ไฟล์ rc ของระบบอยู่ที่ etc/bazel.bazelrc
- ไฟล์ rc ของ Workspace อยู่ที่ $workspace/tools/bazel.rc
- ไฟล์ rc ของบ้านอยู่ที่ $HOME/.bazelrc
ไฟล์ bazelrc แต่ละไฟล์ที่แสดงที่นี่จะมี Flag ที่เกี่ยวข้องซึ่งสามารถใช้ปิดใช้ไฟล์เหล่านั้นได้ (เช่น --nosystem_rc
, --noworkspace_rc
, --nohome_rc
) นอกจากนี้ คุณยังทําให้ Bazel ละเว้นไฟล์ bazelrc ทั้งหมดได้โดยส่งตัวเลือกการเริ่มต้น --ignore_all_rc_files