Các phương pháp hay nhất

Báo cáo vấn đề Xem nguồn Nightly/3}

Trang này giả định rằng bạn đã quen thuộc với Bazel, đồng thời cung cấp các nguyên tắc và lời khuyên về cách xây dựng cấu trúc dự án để khai thác tối đa các tính năng của Bazel.

Mục tiêu chung là:

  • Để sử dụng các phần phụ thuộc chi tiết nhằm cho phép tính song song và gia tăng.
  • Để đóng gói các phần phụ thuộc một cách hiệu quả.
  • Để mã có cấu trúc hợp lý và dễ kiểm thử.
  • Để tạo một cấu hình bản dựng dễ hiểu và dễ duy trì.

Đây không phải là những nguyên tắc bắt buộc: một số dự án sẽ có thể tuân thủ tất cả các nguyên tắc này. Như trang man cho công cụ tìm lỗi mã nguồn cho biết: "Một phần thưởng đặc biệt sẽ được trao cho người đầu tiên tạo ra một chương trình thực không gặp lỗi khi kiểm tra nghiêm ngặt". Tuy nhiên, việc kết hợp càng nhiều nguyên tắc trong số này càng tốt sẽ giúp dự án dễ đọc hơn, ít gặp lỗi hơn và xây dựng nhanh hơn.

Trang này sử dụng các cấp độ yêu cầu được mô tả trong RFC này.

Chạy bản dựng và kiểm thử

Một dự án phải luôn chạy được bazel build //...bazel test //... trên nhánh ổn định của dự án đó. Các mục tiêu cần thiết nhưng không tạo trong một số trường hợp nhất định (chẳng hạn như yêu cầu cờ bản dựng cụ thể, không tạo trên một nền tảng nhất định, yêu cầu thoả thuận cấp phép) phải được gắn thẻ cụ thể nhất có thể (ví dụ: "requires-osx"). Việc gắn thẻ này cho phép lọc mục tiêu ở cấp độ chi tiết hơn so với thẻ "thủ công" và cho phép người kiểm tra tệp BUILD để hiểu được các hạn chế của mục tiêu.

Các phần phụ thuộc của bên thứ ba

Bạn có thể khai báo các phần phụ thuộc của bên thứ ba:

  • Khai báo các kho lưu trữ đó dưới dạng kho lưu trữ từ xa trong tệp WORKSPACE.
  • Bạn cũng có thể chuyển các tệp này vào một thư mục có tên là third_party/ trong thư mục không gian làm việc.

Tuỳ thuộc vào tệp nhị phân

Mọi thứ phải được xây dựng từ nguồn bất cứ khi nào có thể. Nói chung, điều này có nghĩa là thay vì phụ thuộc vào thư viện some-library.so, bạn sẽ tạo tệp BUILD và tạo some-library.so từ các nguồn của nó, sau đó phụ thuộc vào mục tiêu đó.

Việc luôn tạo từ nguồn sẽ đảm bảo rằng bản dựng không sử dụng thư viện được tạo bằng các cờ không tương thích hoặc một cấu trúc khác. Ngoài ra, một số tính năng như mức độ sử dụng, phân tích tĩnh hoặc phân tích động chỉ hoạt động trên nguồn.

Lập phiên bản

Ưu tiên tạo toàn bộ mã từ đầu bất cứ khi nào có thể. Khi phải sử dụng các phiên bản, hãy tránh đưa phiên bản vào tên đích (ví dụ: //guava, chứ không phải //guava-20.0). Cách đặt tên này giúp thư viện dễ cập nhật hơn (chỉ cần cập nhật một mục tiêu). Ngoài ra, thư viện này cũng có khả năng thích ứng tốt hơn trước các vấn đề về phần phụ thuộc kim cương: nếu một thư viện phụ thuộc vào guava-19.0 và một thư viện phụ thuộc vào guava-20.0, thì cuối cùng bạn có thể sẽ có một thư viện cố gắng phụ thuộc vào hai phiên bản khác nhau. Nếu bạn đã tạo một bí danh gây hiểu lầm để trỏ cả hai mục tiêu đến một thư viện guava, thì các tệp BUILD sẽ gây hiểu lầm.

Sử dụng tệp .bazelrc

Để biết các tuỳ chọn dành riêng cho dự án, hãy sử dụng tệp cấu hình workspace/.bazelrc (xem định dạng adb).

Nếu muốn hỗ trợ các tuỳ chọn cho mỗi người dùng cho dự án mà bạn không muốn kiểm tra phần kiểm soát nguồn, hãy thêm dòng:

try-import %workspace%/user.bazelrc

(hoặc bất kỳ tên tệp nào khác) trong workspace/.bazelrc rồi thêm user.bazelrc vào .gitignore.

Gói

Mỗi thư mục chứa các tệp có thể xây dựng phải là một gói. Nếu một tệp BUILD tham chiếu đến các tệp trong thư mục con (chẳng hạn như srcs = ["a/b/C.java"]), thì đó là một dấu hiệu cho thấy tệp BUILD cần được thêm vào thư mục con đó. Cấu trúc này càng tồn tại lâu thì càng có nhiều khả năng các phần phụ thuộc vòng tròn được tạo ra vô tình, phạm vi của mục tiêu sẽ tăng dần và số lượng phần phụ thuộc ngược lại sẽ phải được cập nhật ngày càng tăng.