Câu hỏi thường gặp

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

Sau đây là một số vấn đề và câu hỏi thường gặp khi viết phần mở rộng.

Tại sao tệp của tôi không được tạo / hành động của tôi không bao giờ được thực thi?

Bazel chỉ thực thi các hành động cần thiết để tạo các tệp đầu ra được yêu cầu.

  • Nếu tệp bạn muốn có nhãn, bạn có thể trực tiếp yêu cầu nhãn: bazel build //pkg:myfile.txt

  • Nếu tệp nằm trong nhóm đầu ra của mục tiêu, bạn có thể cần chỉ định nhóm đầu ra đó trên dòng lệnh: bazel build //pkg:mytarget --output_groups=foo

  • Nếu bạn muốn tệp được tạo tự động mỗi khi mục tiêu của bạn được đề cập trên dòng lệnh, hãy thêm tệp đó vào kết quả mặc định của quy tắc bằng cách trả về trình cung cấp DefaultInfo.

Xem trang Quy tắc để biết thêm thông tin.

Tại sao chức năng triển khai của tôi không được thực thi?

Bazel chỉ phân tích các mục tiêu được yêu cầu cho bản dựng. Bạn nên đặt tên cho mục tiêu trên dòng lệnh hoặc đặt tên phụ thuộc vào mục tiêu.

Thiếu tệp khi thực thi hành động hoặc tệp nhị phân của tôi

Hãy đảm bảo rằng 1) tệp đã được đăng ký làm dữ liệu đầu vào cho hành động hoặc tệp nhị phân và 2) tập lệnh hoặc công cụ đang được thực thi đang truy cập vào tệp bằng đường dẫn chính xác.

Đối với hành động, bạn khai báo dữ liệu đầu vào bằng cách truyền dữ liệu đó đến hàm ctx.actions.* tạo ra hành động đó. Bạn có thể lấy đường dẫn thích hợp cho tệp bằng cách sử dụng File.path.

Đối với các tệp nhị phân (kết quả thực thi được chạy bởi một lệnh bazel run hoặc bazel test), bạn sẽ khai báo dữ liệu đầu vào bằng cách đưa chúng vào runfiles. Thay vì dùng trường path, hãy sử dụng File.short_path. Đây là đường dẫn của tệp liên quan đến thư mục runfile mà tệp nhị phân sẽ thực thi.

Làm cách nào để kiểm soát tệp nào do bazel build //pkg:mytarget tạo?

Sử dụng trình cung cấp DefaultInfo để đặt dữ liệu đầu ra mặc định.

Làm cách nào để chạy chương trình hoặc thực hiện I/O tệp trong bản dựng?

Bạn có thể khai báo một công cụ là mục tiêu, tương tự như mọi phần khác trong bản dựng. Công cụ này sẽ chạy trong giai đoạn thực thi để giúp tạo các mục tiêu khác. Để tạo một thao tác chạy một công cụ, hãy sử dụng ctx.actions.run và truyền vào công cụ đó dưới dạng tham số executable.

Trong các giai đoạn tải và phân tích, công cụ không thể chạy và bạn cũng không thể thực hiện thao tác I/O đối với tệp. Điều này có nghĩa là các công cụ và nội dung tệp (ngoại trừ nội dung của tệp BUILD và .bzl) không thể ảnh hưởng đến cách tạo biểu đồ mục tiêu và hành động.

Nếu tôi cần truy cập vào cùng một dữ liệu có cấu trúc cả trước và trong giai đoạn thực thi thì sao?

Bạn có thể định dạng dữ liệu có cấu trúc dưới dạng tệp .bzl. Bạn có thể load() để truy cập tệp trong các giai đoạn tải và phân tích. Bạn có thể truyền tệp này dưới dạng đầu vào hoặc tệp chạy cho các hành động và tệp thực thi cần đến dữ liệu này trong giai đoạn thực thi.

Tôi nên ghi chép mã Starlark như thế nào?

Đối với các quy tắc và thuộc tính quy tắc, bạn có thể truyền giá trị cố định của chuỗi tài liệu (có thể được trích dẫn gấp ba lần) đến tham số doc của rule hoặc attr.*(). Đối với các hàm và macro trợ giúp, hãy sử dụng giá trị cố định chuỗi tài liệu được trích dẫn 3 lần theo định dạng được cung cấp tại đây. Các hàm triển khai quy tắc thường không cần chuỗi tài liệu riêng.

Việc sử dụng giá trị cố định kiểu chuỗi ở các vị trí dự kiến sẽ giúp công cụ tự động trích xuất tài liệu dễ dàng hơn. Bạn có thể dùng các chú thích tiêu chuẩn không theo chuỗi ở bất cứ đâu có thể giúp ích cho người đọc mã.