เขียนไฟล์การกำหนดค่า bazelrc

รายงานปัญหา ดูแหล่งที่มา

Bazel มีตัวเลือกมากมาย ตัวเลือกบางอย่างจะแตกต่างกันไปบ่อยครั้ง (เช่น --subcommands) ในขณะที่ตัวอื่นๆ ยังคงเหมือนเดิมในหลายบิลด์ (เช่น --package_path) หากต้องการหลีกเลี่ยงการระบุตัวเลือกที่ไม่เปลี่ยนแปลงเหล่านี้สำหรับทุกบิลด์ (และคำสั่งอื่นๆ) คุณสามารถระบุตัวเลือกในไฟล์การกำหนดค่าที่เรียกว่า .bazelrc

ไฟล์ .bazelrc อยู่ที่ไหน

Bazel จะค้นหาไฟล์การกำหนดค่าซึ่งไม่บังคับในตำแหน่งต่อไปนี้ ตามลำดับที่แสดงด้านล่าง ระบบจะตีความตัวเลือกตามลำดับนี้ ดังนั้นตัวเลือกในไฟล์ต่อๆ ไปจะลบล้างค่าจากไฟล์ก่อนหน้าได้ ในกรณีที่มีข้อขัดแย้ง ตัวเลือกทั้งหมดที่ควบคุมว่าจะโหลดไฟล์ใดคือตัวเลือกเริ่มต้น ซึ่งหมายความว่าจะต้องเกิดขึ้นหลัง bazel และก่อนคำสั่ง (build, test ฯลฯ)

  1. ไฟล์ 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

  2. ไฟล์ RC ของพื้นที่ทำงาน ยกเว้นว่าจะมี --noworkspace_rc อยู่

    เส้นทาง: .bazelrc ในไดเรกทอรีพื้นที่ทำงาน (ถัดจากไฟล์ WORKSPACE หลัก)

    ข้อผิดพลาดจะไม่ถือว่ามีข้อผิดพลาดหากไม่มีไฟล์นี้

  3. ไฟล์ RC ของบ้าน ยกเว้นว่าจะมี --nohome_rc อยู่

    เส้นทาง:

    • ใน Linux/macOS/Unixes: $HOME/.bazelrc
    • ใน Windows: %USERPROFILE%\.bazelrc (หากมี) หรือ %HOME%/.bazelrc

    ข้อผิดพลาดจะไม่ถือว่ามีข้อผิดพลาดหากไม่มีไฟล์นี้

  4. ไฟล์ 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

เช่นเดียวกับไฟล์ UNIX "rc" ไฟล์ .bazelrc เป็นไฟล์ข้อความที่มีไวยากรณ์แบบขึ้นบรรทัดใหม่ ระบบจะไม่สนใจบรรทัดและบรรทัดว่างที่เริ่มต้นด้วย # (ความคิดเห็น) แต่ละบรรทัดจะมีลำดับของคำต่างๆ ซึ่งแปลงเป็นโทเค็นตามกฎเดียวกันกับเชลล์ของ Bourne

การนำเข้า

บรรทัดที่เริ่มต้นด้วย 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 แบบ "in-place" เพื่อให้ตัวเลือกที่ระบุสำหรับการกำหนดค่ามีลำดับความสำคัญเดียวกับที่ตัวเลือก --config=foo มี

ไวยากรณ์นี้ไม่ได้ครอบคลุมถึงการใช้ startup เพื่อตั้งค่าตัวเลือกการเริ่มต้นใช้งาน ระบบจะไม่สนใจการตั้งค่า startup:config-name --some_startup_option ใน .bazelrc

--enable_platform_specific_config

การกำหนดค่าเฉพาะแพลตฟอร์มใน .bazelrc จะเปิดใช้ได้โดยอัตโนมัติโดยใช้ --enable_platform_specific_config เช่น หากระบบปฏิบัติการของโฮสต์คือ Linux และเรียกใช้คำสั่ง build ระบบจะเปิดใช้การกำหนดค่า build:linux โดยอัตโนมัติ ตัวระบุระบบปฏิบัติการที่รองรับคือ linux, macos, windows, freebsd และ openbsd การเปิดใช้แฟล็กนี้เทียบเท่ากับการใช้ --config=linux ใน Linux, --config=windows ใน 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

คุณสามารถระบุไดเรกทอรีภายในพื้นที่ทำงานที่คุณต้องการให้ Bazel ละเว้นได้ เช่น โปรเจ็กต์ที่เกี่ยวข้องซึ่งใช้ระบบบิลด์อื่นๆ วางไฟล์ชื่อ .bazelignore ที่รูทของพื้นที่ทำงานและเพิ่มไดเรกทอรีที่คุณต้องการให้ Bazel ละเว้นบรรทัดละ 1 รายการ รายการจะสัมพัทธ์กับรูทของพื้นที่ทำงาน

ไฟล์ bazelrc ส่วนกลาง

Bazel อ่านไฟล์ bazelrc ที่ไม่บังคับตามลำดับต่อไปนี้

  1. ไฟล์ rc ของระบบอยู่ที่ etc/bazel.bazelrc
  2. ไฟล์ rc ของ Workspace อยู่ที่ $workspace/tools/bazel.rc
  3. ไฟล์ rc ของ Home อยู่ที่ $HOME/.bazelrc

ไฟล์ bazelrc แต่ละไฟล์ที่ระบุไว้ที่นี่มีแฟล็กที่เกี่ยวข้องซึ่งสามารถใช้เพื่อปิดได้ (เช่น --nosystem_rc, --noworkspace_rc, --nohome_rc) และคุณยังทำให้ Bazel ละเว้น bazelrcs ทั้งหมดได้โดยผ่านตัวเลือกการเริ่มต้น --ignore_all_rc_files