Hãy tưởng tượng bạn cần chạy một công cụ trong quá trình xây dựng. Ví dụ: bạn có thể muốn tạo hoặc xử lý trước tệp nguồn hoặc nén tệp nhị phân. Trong hướng dẫn này, bạn sẽ tạo một macro đổi kích thước hình ảnh.
Macro phù hợp với các tác vụ đơn giản. Nếu bạn muốn làm bất cứ việc gì phức tạp hơn, chẳng hạn như thêm tính năng hỗ trợ cho một ngôn ngữ lập trình mới, hãy cân nhắc tạo quy tắc. Quy tắc giúp bạn có thêm quyền kiểm soát và sự linh hoạt.
Cách dễ nhất để tạo macro đổi kích thước hình ảnh là sử dụng genrule
:
genrule(
name = "logo_miniature",
srcs = ["logo.png"],
outs = ["small_logo.png"],
cmd = "convert $< -resize 100x100 $@",
)
cc_binary(
name = "my_app",
srcs = ["my_app.cc"],
data = [":logo_miniature"],
)
Nếu cần đổi kích thước nhiều hình ảnh hơn, bạn nên sử dụng lại mã này. Để thực hiện việc đó, hãy định nghĩa một hàm trong một tệp .bzl
riêng biệt và gọi tệp đó là miniature.bzl
:
def miniature(name, src, size="100x100", **kwargs):
"""Create a miniature of the src image.
The generated file is prefixed with 'small_'.
"""
native.genrule(
name = name,
srcs = [src],
outs = ["small_" + src],
cmd = "convert $< -resize " + size + " $@",
**kwargs
)
Một vài nhận xét:
Theo quy ước, macro có một đối số
name
, giống như các quy tắc.Để ghi lại hành vi của một macro, hãy sử dụng docstring như trong Python.
Để gọi
genrule
hay bất kỳ quy tắc gốc nào khác, hãy sử dụngnative.
.Sử dụng
**kwargs
để chuyển tiếp các đối số bổ sung đếngenrule
cơ bản (cũng giống như trong Python). Điều này rất hữu ích để người dùng có thể sử dụng các thuộc tính chuẩn nhưvisibility
hoặctags
.
Bây giờ, hãy sử dụng macro từ tệp BUILD
:
load("//path/to:miniature.bzl", "miniature")
miniature(
name = "logo_miniature",
src = "image.png",
)
cc_binary(
name = "my_app",
srcs = ["my_app.cc"],
data = [":logo_miniature"],
)