Sau đây là một số vấn đề và câu hỏi thường gặp về việc viết tiện ích.
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 hiện?
Bazel chỉ thực thi những thao tác cần thiết để tạo ra 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ể yêu cầu trực tiếp:
bazel build //pkg:myfile.txt
Nếu tệp nằm trong một 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 bất cứ khi nào 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 các đầu ra mặc định của quy tắc bằng cách trả về một trình cung cấp
DefaultInfo
.
Hãy xem trang Quy tắc để biết thêm thông tin.
Tại sao hàm triển khai của tôi không được thực thi?
Bazel chỉ phân tích những 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 cho mục tiêu tuỳ thuộc vào mục tiêu đó.
Thiếu một tệp khi hành động hoặc tệp nhị phân của tôi được thực thi
Đảm bảo rằng 1) tệp đã được đăng ký làm đầu vào cho thao tác 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 các thao tác, bạn khai báo dữ liệu đầu vào bằng cách truyền dữ liệu đầu vào đến hàm ctx.actions.*
tạo thao tác. 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 (đầu ra thực thi do lệnh bazel run
hoặc bazel test
chạy), bạn khai báo các đầu vào bằng cách đưa chúng vào runfiles. Thay vì sử dụng trường path
, hãy dùng File.short_path
. Đây là đường dẫn của tệp tương ứng với thư mục runfiles mà tệp nhị phân thực thi.
Làm cách nào để kiểm soát những tệp được tạo bởi bazel build //pkg:mytarget
?
Sử dụng trình cung cấp DefaultInfo
để đặt đầu ra mặc định.
Làm cách nào để chạy một chương trình hoặc thực hiện thao tác I/O tệp trong quá trình tạo?
Bạn có thể khai báo một công cụ làm mục tiêu, giống như bất kỳ phần nào khác trong bản dựng của bạn và 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 công cụ đó dưới dạng tham số executable
.
Trong giai đoạn tải và phân tích, một 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 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 đồ thị 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()
tệp để truy cập vào tệp đó trong 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 runfile cho các thao tác và tệp thực thi cần đến tệp này trong giai đoạn thực thi.
Tôi nên ghi lại 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 một giá trị cố định docstring (có thể là giá trị được trích dẫn 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 một chuỗi ký tự docstring được trích dẫn ba lần theo định dạng được đưa ra 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 các giá trị cố định chuỗi ở những vị trí dự kiến sẽ giúp công cụ tự động dễ dàng trích xuất tài liệu. Bạn có thể thoải mái sử dụng các chú thích không phải là chuỗi tiêu chuẩn ở bất cứ nơi nào có thể giúp ích cho người đọc mã của bạn.