דמיינו שאתם צריכים להפעיל כלי כחלק מה-build שלכם. לדוגמה, תוכלו ליצור או לעבד קובץ מקור, או לדחוס קובץ בינארי. במדריך הזה, אתם עומדים ליצור מאקרו שמשנה גודל של תמונה.
פקודות מאקרו מתאימות למשימות פשוטות. אם רוצים לעשות מסובכים יותר, למשל להוסיף תמיכה בשפת תכנות חדשה, מומלץ ליצור כלל. כללים נותנים לכם יותר שליטה וגמישות.
הדרך הקלה ביותר ליצור מאקרו שמשנה גודל של תמונה היא להשתמש ב-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"],
)
אם תצטרך לשנות את הגודל של תמונות נוספות, מומלץ להשתמש שוב בקוד. לשם כך,
יש להגדיר פונקציה בקובץ .bzl
נפרד, ולקרוא לקובץ 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
)
מספר הערות:
כמקובל, פקודות מאקרו כוללות ארגומנט של
name
, בדיוק כמו כללים.כדי לתעד את ההתנהגות של מאקרו, השתמשו ב-docstring כמו ב-Python.
כדי להתקשר אל
genrule
, או לכל כלל מקומי אחר, יש להשתמש ב-native.
.יש להשתמש ב-
**kwargs
כדי להעביר את הארגומנטים הנוספים ל-genrule
הבסיסי (הוא פועל בדיוק כמו ב-Python). זה שימושי, כך שמשתמשים יכולים להשתמש במאפיינים רגילים כמוvisibility
, אוtags
.
כעת, השתמש במאקרו מהקובץ 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"],
)