Tôi đang gọi cho Bazel bằng các tập lệnh

Báo cáo vấn đề Xem nguồn Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bạn có thể gọi Bazel từ các tập lệnh để tạo bản dựng, chạy kiểm thử hoặc truy vấn biểu đồ phần phụ thuộc. Bazel được thiết kế để hỗ trợ việc tạo tập lệnh hiệu quả, nhưng phần này liệt kê một số chi tiết cần lưu ý để giúp tập lệnh của bạn mạnh mẽ hơn.

Chọn cơ sở đầu ra

Tuỳ chọn --output_base kiểm soát vị trí mà quy trình Bazel sẽ ghi đầu ra của một bản dựng, cũng như nhiều tệp đang hoạt động mà Bazel sử dụng nội bộ, một trong số đó là khoá bảo vệ chống lại việc nhiều quy trình Bazel đồng thời thay đổi cơ sở đầu ra.

Việc chọn thư mục cơ sở đầu ra chính xác cho tập lệnh phụ thuộc vào một số yếu tố. Nếu bạn cần đặt đầu ra bản dựng ở một vị trí cụ thể, thì điều này sẽ quyết định cơ sở đầu ra mà bạn cần sử dụng. Nếu bạn đang thực hiện lệnh gọi "chỉ có thể đọc" đến Bazel (chẳng hạn như bazel query), thì các yếu tố khoá sẽ quan trọng hơn. Cụ thể, nếu cần chạy đồng thời nhiều thực thể của tập lệnh, bạn nên lưu ý rằng mỗi quy trình máy chủ Blaze có thể xử lý tối đa một lệnh gọi tại một thời điểm. Tuỳ thuộc vào trường hợp của bạn, mỗi thực thể của tập lệnh có thể chờ đến lượt hoặc bạn có thể sử dụng --output_base để chạy nhiều máy chủ Blaze và sử dụng các máy chủ đó.

Nếu sử dụng giá trị cơ sở đầu ra mặc định, bạn sẽ phải cạnh tranh với cùng một khoá mà các lệnh Bazel tương tác của người dùng sử dụng. Nếu người dùng đưa ra các lệnh chạy trong thời gian dài, chẳng hạn như bản dựng, thì tập lệnh của bạn sẽ phải đợi các lệnh đó hoàn tất thì mới có thể tiếp tục.

Ghi chú về chế độ máy chủ

Theo mặc định, Bazel sử dụng quy trình máy chủ chạy trong thời gian dài làm phương thức tối ưu hoá. Khi chạy Bazel trong một tập lệnh, đừng quên gọi shutdown khi bạn hoàn tất với máy chủ hoặc chỉ định --max_idle_secs=5 để các máy chủ rảnh tự tắt ngay lập tức.

Tôi sẽ nhận được mã thoát nào?

Bazel cố gắng phân biệt các lỗi do mã nguồn đang được xem xét gây ra với các lỗi bên ngoài khiến Bazel không thể thực thi đúng cách. Quá trình thực thi Bazel có thể dẫn đến các mã thoát sau:

Mã thoát phổ biến cho tất cả các lệnh:

  • 0 – Thành công
  • 2 – Vấn đề về dòng lệnh, cờ hoặc tổ hợp lệnh không hợp lệ hoặc xấu hoặc Biến môi trường không hợp lệ. Bạn phải sửa đổi dòng lệnh.
  • 8 – Quá trình xây dựng bị gián đoạn nhưng chúng tôi đã chấm dứt bằng cách tắt máy một cách có trật tự.
  • 9 – Khoá máy chủ được giữ và --noblock_for_lock đã được truyền.
  • 32 – Lỗi môi trường bên ngoài không xảy ra trên máy này.

  • 33 – Bazel hết bộ nhớ và gặp sự cố. Bạn cần sửa đổi dòng lệnh.

  • 34 – Dành riêng cho mục đích sử dụng nội bộ của Google.

  • 35 – Dành riêng cho mục đích sử dụng nội bộ của Google.

  • 36 – Vấn đề về môi trường cục bộ, có khả năng là vĩnh viễn.

  • 37 – Ngoại lệ chưa được xử lý / Lỗi Bazel nội bộ.

  • 38 – Lỗi tạm thời khi phát hành kết quả cho Dịch vụ sự kiện bản dựng.

  • 39 – Các Blob mà Bazel yêu cầu sẽ bị loại bỏ khỏi Bộ nhớ đệm từ xa.

  • 41-44 – Dành riêng cho mục đích sử dụng nội bộ của Google.

  • 45 – Lỗi liên tục khi phát hành kết quả cho Dịch vụ sự kiện bản dựng.

  • 47 – Dành riêng cho mục đích sử dụng nội bộ của Google.

  • 49 – Dành riêng cho mục đích sử dụng nội bộ của Google.

Mã trả về cho các lệnh bazel build, bazel test:

  • 1 – Không tạo được bản dựng.
  • 3 – Bản dựng OK, nhưng một số kiểm thử không thành công hoặc hết thời gian chờ.
  • 4 – Xây dựng thành công nhưng không tìm thấy kiểm thử nào mặc dù bạn đã yêu cầu kiểm thử.

Đối với bazel run:

  • 1 – Không tạo được bản dựng.
  • Nếu bản dựng thành công nhưng quy trình con đã thực thi trả về một mã thoát khác 0, thì đó cũng sẽ là mã thoát của lệnh.

Đối với bazel query:

  • 3 – Thành công một phần, nhưng truy vấn gặp phải 1 hoặc nhiều lỗi trong tập hợp tệp BUILD đầu vào, do đó kết quả của thao tác này không đáng tin cậy 100%. Điều này có thể là do tuỳ chọn --keep_going trên dòng lệnh.
  • 7 – Lỗi lệnh.

Các phiên bản Bazel trong tương lai có thể thêm các mã thoát bổ sung, thay thế mã thoát lỗi chung 1 bằng một giá trị khác không bằng 0 có ý nghĩa cụ thể. Tuy nhiên, tất cả giá trị thoát khác 0 sẽ luôn tạo thành lỗi.

Đọc tệp .bazelrc

Theo mặc định, Bazel đọc tệp .bazelrc từ thư mục không gian làm việc cơ sở hoặc thư mục gốc của người dùng. Việc này có nên làm hay không là một lựa chọn cho tập lệnh của bạn; nếu tập lệnh của bạn cần hoàn toàn kín đáo (chẳng hạn như khi tạo bản phát hành), bạn nên tắt tính năng đọc tệp .bazelrc bằng cách sử dụng tuỳ chọn --bazelrc=/dev/null. Nếu bạn muốn tạo bản dựng bằng chế độ cài đặt mà người dùng ưu tiên, thì hành vi mặc định sẽ tốt hơn.

Nhật ký lệnh

Đầu ra Bazel cũng có trong tệp nhật ký lệnh mà bạn có thể tìm thấy bằng lệnh sau:

bazel info command_log

Tệp nhật ký lệnh chứa các luồng stdout và stderr xen kẽ của lệnh Bazel gần đây nhất. Xin lưu ý rằng việc chạy bazel info sẽ ghi đè nội dung của tệp này, vì sau đó tệp này sẽ trở thành lệnh Bazel gần đây nhất. Tuy nhiên, vị trí của tệp nhật ký lệnh sẽ không thay đổi trừ phi bạn thay đổi chế độ cài đặt của tuỳ chọn --output_base hoặc --output_user_root.

Phân tích cú pháp đầu ra

Dữ liệu đầu ra của Bazel khá dễ phân tích cú pháp cho nhiều mục đích. Hai tuỳ chọn có thể hữu ích cho tập lệnh của bạn là --noshow_progress giúp ngăn chặn thông báo tiến trình và --show_result n giúp kiểm soát việc có in thông báo "build up-to-date" (tạo bản dựng mới nhất) hay không; các thông báo này có thể được phân tích cú pháp để khám phá những mục tiêu nào đã được tạo thành công và vị trí của các tệp đầu ra mà chúng đã tạo. Hãy nhớ chỉ định một giá trị rất lớn của n nếu bạn dựa vào các thông báo này.

Khắc phục sự cố về hiệu suất bằng cách phân tích

Xem phần Phân tích hiệu suất.