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 phải chỉ định rằng 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 là được đề cập trên dòng lệnh, hãy thêm nó vào kết quả mặc định của quy tắc bằng cách trả về một 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 hoặc đặt tên cho mục tiêu trên dòng lệnh hoặc tên nào đó phụ thuộc vào .
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 thao tác hoặc nhị phân và 2) tập lệnh hoặc công cụ đang được thực thi đang truy cập tệp bằng cách sử dụ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 đúng cho tệp bằng cách sử dụng
File.path
.
Đối với tệp nhị phân (kết quả thực thi được chạy bởi bazel run
hoặc bazel test
), bạn khai báo dữ liệu đầu vào bằng cách đưa chúng vào
runfiles. Thay vì sử dụng trường path
, hãy sử dụng
File.short_path
, 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 tệp nào do bazel build //pkg:mytarget
tạo?
Sử dụng trình cung cấp DefaultInfo
để
đặt đầ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 công cụ là mục tiêu, giống như bất kỳ phần nào khác trong bản dựng, và
chạy trong giai đoạn thực thi để giúp xây dựng các mục tiêu khác. Cách tạo một hành động
chạy một công cụ, hãy sử dụng ctx.actions.run
và truyền vào
làm 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 tệp I/O. Tức là các công cụ và nội dung tệp (ngoại trừ nội dung của BUILD và .bzl) không thể ảnh hưởng đến cách tạo biểu đồ mục tiêu và biểu đồ 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 đó trong giai đoạn tải và phân tích. Bạn có thể truyền dưới dạng dữ liệu đầu vào hoặc
runfile thành các hành động và tệp thực thi cần đến hành động 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 chuỗi tài liệu (có thể là
được trích dẫn 3 lần) vào tham số doc
của rule
hoặc attr.*()
. Dành cho người trợ giúp
hàm và macro, hãy sử dụng giá trị cố định dạng chuỗi tài liệu được trích dẫn 3 lần theo định dạng
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 quá trình tự động hoá công cụ trích xuất tài liệu. Bạn có thể dùng các nhận xét tiêu chuẩn không phải chuỗi ở bất cứ nơi nào nó có thể giúp người đọc mã.