Ghi tệp cấu hình bazelrc

Bazel chấp nhận nhiều lựa chọn. Một số tuỳ chọn được thay đổi thường xuyên (ví dụ: --subcommands) trong khi các tuỳ chọn khác vẫn giữ nguyên trên nhiều bản dựng (chẳng hạn như --package_path). Để tránh chỉ định các tuỳ chọn không thay đổi này cho mọi bản dựng (và các lệnh khác), bạn có thể chỉ định các tuỳ chọn trong tệp cấu hình có tên .bazelrc.

Các tệp .bazelrc ở đâu?

Bazel tìm các tệp cấu hình không bắt buộc ở các vị trí dưới đây, theo thứ tự hiển thị dưới đây. Các tuỳ chọn được diễn giải theo thứ tự này, vì vậy, các tuỳ chọn trong các tệp sau này có thể ghi đè giá trị từ tệp trước đó nếu phát sinh xung đột. Tất cả các tuỳ chọn kiểm soát tệp nào trong số này được tải đều là tuỳ chọn khởi động, nghĩa là các tuỳ chọn này phải xuất hiện sau bazel và trước lệnh (build, test, v.v.).

  1. Tệp RC của hệ thống, trừ phi có --nosystem_rc.

    Đường dẫn:

    • Trên Linux/macOS/Unixes: /etc/bazel.bazelrc
    • Trên Windows: %ProgramData%\bazel.bazelrc

    Sẽ không có lỗi nếu tệp này không tồn tại.

    Nếu cần có một vị trí khác do hệ thống chỉ định, bạn phải tạo một tệp nhị phân Bazel tuỳ chỉnh, ghi đè giá trị BAZEL_SYSTEM_BAZELRC_PATH trong //src/main/cpp:option_processor. Vị trí do hệ thống chỉ định có thể chứa các tệp tham chiếu biến môi trường, chẳng hạn như ${VAR_NAME} trên Unix hoặc %VAR_NAME% trên Windows.

  2. Tệp RC của Workspace, trừ phi có --noworkspace_rc.

    Đường dẫn: .bazelrc trong thư mục không gian làm việc (bên cạnh tệp WORKSPACE chính).

    Sẽ không có lỗi nếu tệp này không tồn tại.

  3. Tệp RC tại nhà, trừ phi có --nohome_rc.

    Đường dẫn:

    • Trên Linux/macOS/Unixes: $HOME/.bazelrc
    • Trên Windows: %USERPROFILE%\.bazelrc nếu có hoặc %HOME%/.bazelrc

    Sẽ không có lỗi nếu tệp này không tồn tại.

  4. Tệp RC do người dùng chỉ định, nếu được chỉ định bằng --bazelrc=file

    Cờ này là không bắt buộc nhưng cũng có thể được chỉ định nhiều lần.

    /dev/null cho biết rằng tất cả các --bazelrc khác sẽ bị bỏ qua. Điều này rất hữu ích khi tắt tính năng tìm kiếm tệp rc người dùng, chẳng hạn như trong các bản phát hành.

    Ví dụ:

    --bazelrc=x.rc --bazelrc=y.rc --bazelrc=/dev/null --bazelrc=z.rc
    
    • x.rcy.rc đã được đọc.
    • z.rc bị bỏ qua do /dev/null trước đó.

Ngoài tệp cấu hình không bắt buộc này, Bazel còn tìm một tệp rc toàn cục. Để biết thêm chi tiết, hãy xem phần bazelrc toàn cầu.

Cú pháp và ngữ nghĩa .bazelrc

Giống như tất cả các tệp "rc" của UNIX, tệp .bazelrc là tệp văn bản có ngữ pháp dựa trên dòng. Các dòng và dòng trống bắt đầu bằng # (nhận xét) sẽ bị bỏ qua. Mỗi dòng chứa một chuỗi các từ được mã hoá theo cùng quy tắc như shell Bourne.

Nhập

Những dòng bắt đầu bằng import hoặc try-import là đặc biệt: hãy sử dụng những dòng này để tải các tệp "rc" khác. Để chỉ định một đường dẫn tương ứng với thư mục gốc của không gian làm việc, hãy ghi import %workspace%/path/to/bazelrc.

Điểm khác biệt giữa importtry-import là Bazel sẽ gặp lỗi nếu tệp của import bị thiếu (hoặc không đọc được), nhưng không phải như vậy đối với tệp của try-import.

Mức độ ưu tiên nhập:

  • Các tuỳ chọn trong tệp được nhập được ưu tiên hơn các tuỳ chọn được chỉ định trước câu lệnh nhập.
  • Các tuỳ chọn được chỉ định sau câu lệnh nhập sẽ được ưu tiên so với các tuỳ chọn trong tệp được nhập.
  • Tuỳ chọn trong các tệp được nhập sau sẽ được ưu tiên so với các tệp được nhập trước đó.

Mặc định của lựa chọn

Hầu hết các dòng của bazelrc đều xác định giá trị tuỳ chọn mặc định. Từ đầu tiên trên mỗi dòng chỉ định thời điểm áp dụng các giá trị mặc định này:

  • startup: các tuỳ chọn khởi động, xuất hiện trước lệnh và được mô tả trong bazel help startup_options.
  • common: các tuỳ chọn áp dụng cho mọi lệnh Bazel.
  • command: Lệnh Bazel, chẳng hạn như build hoặc query, có áp dụng các tuỳ chọn. Các tuỳ chọn này cũng áp dụng cho tất cả các lệnh kế thừa từ lệnh được chỉ định. (Ví dụ: test kế thừa từ build.)

Mỗi dòng trong số này có thể được sử dụng nhiều lần và các đối số đứng sau từ đầu tiên được kết hợp như thể chúng xuất hiện trên một dòng duy nhất. (Người dùng CVS, một công cụ khác có giao diện dòng lệnh "Dao quân đội Thuỵ Sĩ", sẽ tìm thấy cú pháp tương tự như cú pháp của .cvsrc.) Ví dụ: các dòng:

build --test_tmpdir=/tmp/foo --verbose_failures
build --test_tmpdir=/tmp/bar

được kết hợp như sau:

build --test_tmpdir=/tmp/foo --verbose_failures --test_tmpdir=/tmp/bar

nên cờ hiệu quả là --verbose_failures--test_tmpdir=/tmp/bar.

Thứ tự ưu tiên của lựa chọn:

  • Các tuỳ chọn trên dòng lệnh luôn được ưu tiên hơn các tuỳ chọn trong tệp rc. Ví dụ: nếu một tệp rc cho biết build -c opt nhưng cờ dòng lệnh là -c dbg, thì cờ dòng lệnh sẽ được ưu tiên.
  • Trong tệp rc, mức độ ưu tiên được điều chỉnh theo mức độ cụ thể: các dòng của một lệnh cụ thể hơn được ưu tiên so với các dòng cho một lệnh ít cụ thể hơn.

    Tính cụ thể được xác định theo tính kế thừa. Một số lệnh kế thừa tuỳ chọn từ các lệnh khác, làm cho lệnh kế thừa cụ thể hơn so với lệnh cơ sở. Ví dụ: test kế thừa từ lệnh build, vì vậy, tất cả cờ bazel build đều hợp lệ với bazel test và tất cả các dòng build cũng áp dụng cho bazel test trừ phi có dòng test cho cùng một tuỳ chọn. Nếu tệp rc cho biết:

    test -c dbg --test_env=PATH
    build -c opt --verbose_failures
    

    thì bazel build //foo sẽ sử dụng -c opt --verbose_failures, còn bazel test //foo sẽ sử dụng --verbose_failures -c dbg --test_env=PATH.

    Biểu đồ kế thừa (tính cụ thể) là:

    • Mọi lệnh đều kế thừa từ common
    • Các lệnh sau kế thừa (và cụ thể hơn) build: test, run, clean, mobile-install, info, print_action, config, cqueryaquery
    • coverage kế thừa từ test
  • 2 dòng chỉ định các tuỳ chọn cho cùng một lệnh có độ cụ thể bằng nhau được phân tích cú pháp theo thứ tự xuất hiện trong tệp.

  • Vì quy tắc ưu tiên này không khớp với thứ tự tệp, nên quy tắc này giúp cải thiện khả năng đọc nếu bạn tuân theo thứ tự ưu tiên trong các tệp rc: bắt đầu bằng các tuỳ chọn common ở trên cùng và kết thúc bằng các lệnh cụ thể nhất ở cuối tệp. Bằng cách này, thứ tự đọc các tuỳ chọn sẽ giống với thứ tự áp dụng các tuỳ chọn, điều này trực quan hơn.

Các đối số được chỉ định trên một dòng của tệp rc có thể bao gồm các đối số không phải là tuỳ chọn, chẳng hạn như tên của mục tiêu bản dựng, v.v. Các tuỳ chọn này (tương tự như các tuỳ chọn được chỉ định trong cùng tệp), có mức độ ưu tiên thấp hơn so với các lựa chọn đồng cấp trong dòng lệnh và luôn được thêm vào trước danh sách rõ ràng các đối số không phải tuỳ chọn.

--config

Ngoài việc đặt giá trị mặc định cho tuỳ chọn, bạn có thể sử dụng tệp rc để nhóm các tuỳ chọn và cung cấp cú pháp viết tắt cho các nhóm phổ biến. Bạn có thể thực hiện việc này bằng cách thêm hậu tố :name vào lệnh. Các tuỳ chọn này bị bỏ qua theo mặc định, nhưng sẽ được đưa vào khi tuỳ chọn --config=name xuất hiện, trên dòng lệnh hoặc trong tệp .bazelrc, theo cách đệ quy, ngay cả bên trong một định nghĩa cấu hình khác. Các tuỳ chọn do command:name chỉ định sẽ chỉ được mở rộng cho các lệnh hiện hành, theo thứ tự ưu tiên mô tả ở trên.

--config=foo mở rộng thành các tuỳ chọn được xác định trong các tệp rc "tại chỗ" để các tuỳ chọn được chỉ định cho cấu hình có cùng mức độ ưu tiên so với tuỳ chọn --config=foo.

Cú pháp này không áp dụng cho việc sử dụng startup để đặt các tuỳ chọn khởi động. Việc đặt startup:config-name --some_startup_option trong .bazelrc sẽ bị bỏ qua.

Ví dụ:

Dưới đây là tệp ~/.bazelrc mẫu:

# 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

Các tệp khác chi phối hành vi của Bazel

.bazelignore

Bạn có thể chỉ định các thư mục trong không gian làm việc mà bạn muốn Bazel bỏ qua, chẳng hạn như các dự án có liên quan sử dụng các hệ thống xây dựng khác. Đặt một tệp có tên là .bazelignore vào thư mục gốc của không gian làm việc và thêm các thư mục bạn muốn Bazel bỏ qua, mỗi thư mục một dòng. Các mục nhập là tương ứng với thư mục gốc của không gian làm việc.

Tệp bazelrc toàn cầu

Bazel đọc các tệp bazelrc không bắt buộc theo thứ tự sau: – Tệp rc hệ thống nằm tại etc/bazel.bazelrc. – Tệp rc của Workspace đặt tại $workspace/tools/bazel.rc. - Tệp rc tại nhà được bản địa hoá tại $HOME/.bazelrc

Mỗi tệp bazelrc được liệt kê ở đây đều có một cờ tương ứng có thể dùng để vô hiệu hoá các tệp đó (ví dụ: --nosystem_rc, --noworkspace_rc, --nohome_rc). Bạn cũng có thể khiến Bazel bỏ qua tất cả các bazelrc bằng cách chuyển tuỳ chọn khởi động --ignore_all_rc_files.