כאן מוסבר איך יוצרים כללי מאגר ומפורטות דוגמאות לפרטים נוספים.
מאגר חיצוני הוא כלל שאפשר להשתמש בו רק בקובץ WORKSPACE
, ומאפשר פעולה לא-הירמטית בשלב הטעינה של Bazel. כל כלל מאגר חיצוני יוצר סביבת עבודה משלו, עם BUILD
קבצים ופריטים משלו. אפשר להשתמש בהן כדי להסתמך על ספריות של צד שלישי (כמו ספריות ארוזות של Maven), אבל גם כדי ליצור קובצי BUILD
ספציפיים למארח שבו בזל פועל.
יצירת כלל מאגר
בקובץ .bzl
, משתמשים בפונקציה
repository_rule כדי ליצור כלל מאגר חדש ולשמור אותו במשתנה גלובלי.
ניתן להשתמש בכלל של מאגר מותאם אישית בדיוק כמו כלל של מאגר מקורי. יש לו מאפיין name
חובה וכל יעד שנמצא בקובצי ה-build שלו יכול להיספר כ-@<name>//package:target
, כאשר <name>
הוא הערך של המאפיין name
.
הכלל נטען כאשר אתם בונים אותו באופן מפורש, או אם הוא תלוי בבניית ה-build. במקרה כזה, Bazel תבצע את הפונקציה implementation
שלה. הפונקציה הזו מתארת איך ליצור את המאגר, את התוכן שלו ואת קובצי BUILD
.
מאפיינים
מאפיין הוא ארגומנט של כלל, כגון url
או sha256
. כשמגדירים את הכלל של מאגר, צריך לפרט את המאפיינים ואת הסוגים שלהם.
local_repository = repository_rule(
implementation=_impl,
local=True,
attrs={"path": attr.string(mandatory=True)})
יש להשתמש ב-repository_ctx.attr.<attribute_name>
כדי לגשת למאפיין מסוים.
לכל repository_rule
יש מאפיינים שמוגדרים באופן לא מפורש (בדיוק כמו בכללי build). שני המאפיינים המשתמעים הם name
(בדיוק כמו בכללי build) ו-repo_mapping
. אפשר לגשת לשם של כלל מאגר עם
repository_ctx.name
. המשמעות של repo_mapping
זהה לזו של כללי המאגר המקוריים local_repository
ושל new_local_repository
.
אם שם מאפיין מתחיל ב-_
הוא פרטי והמשתמשים לא יכולים להגדיר אותו.
פונקציית הטמעה
לכל כלל מאגר נדרש פונקציה implementation
. הוא כולל את הלוגיקה בפועל של הכלל, והוא מופעל אך ורק בשלב הטעינה.
הפונקציה מכילה פרמטר קלט אחד בלבד, repository_ctx
. הפונקציה מחזירה את None
כדי לציין שהכלל ניתן לחזרה בהינתן הפרמטרים שצוינו, או הצהרה עם קבוצת פרמטרים עבור הכלל הזה שתהפוך את הכלל הזה לפרמטר שניתן להפקה שיוצרים את אותו מאגר נתונים. לדוגמה, עבור כלל שעוקב אחר מאגר מאגרים שפירושו להחזיר מזהה התחייבות ספציפי במקום סניף צף שצוין במקור.
ניתן להשתמש בפרמטר repository_ctx
להזנת נתונים כדי לגשת לערכי מאפיינים ולפונקציות לא הרריות (חיפוש קובץ בינארי, ביצוע קובץ בינארי, יצירת קובץ במאגר או הורדת קובץ מהאינטרנט). הקשרים נוספים זמינים בספרייה. דוגמה:
def _impl(repository_ctx):
repository_ctx.symlink(repository_ctx.attr.path, "")
local_repository = repository_rule(
implementation=_impl,
...)
מתי פונקציית ההטמעה מופעלת?
אם המאגר מוגדר כ-local
, שינוי תלות בתרשים התלויות (כולל קובץ ה-WORKSPACE
עצמו) יגרום להפעלת פונקציית ההטמעה.
ניתן להפעיל מחדש את פונקציית ההטמעה אם תלות מסוימת שהיא מבקשת חסרה. ההתחלה של פונקציית ההטמעה תופעל מחדש לאחר שהפתרון תלוי. כדי למנוע הפעלות מחדש מיותרות (שעשויות להיות חוזרות, משום שייתכן שיהיה צורך לחזור על הגישה לרשת), הארגומנטים של התוויות יאוחזרו מראש, בתנאי שניתן לפתור את כל הארגומנטים של התווית בקובץ קיים. שימו לב שפתרון נתיב ממחרוזת או תווית שנבנתה רק בזמן הפעלת הפונקציה עדיין עלול לגרום להפעלה מחדש.
לבסוף, עבור מאגרים שאינם של local
, רק שינוי בתלות הבאות עלול לגרום להפעלה מחדש:
- נדרשים
.bzl
קבצים כדי להגדיר את כלל המאגר. - הצהרה על כלל המאגר בקובץ
WORKSPACE
. - הערך של כל משתנה סביבה שהוצהר באמצעות המאפיין
environ
של הפונקציהrepository_rule
. אפשר לאכוף את הערך של משתנה הסביבה הזה בשורת הפקודה באמצעות הדגל--action_env
(אבל הדגל הזה יגרום לביטול כל פעולה ב-build). - תוכן של כל קובץ שנעשה בו שימוש בתווית ומוזכרים בו (לדוגמה,
//mypkg:label.txt
לאmypkg/label.txt
).
אילוץ אחזור מחדש של מאגרים חיצוניים
לפעמים מאגר נתונים חיצוני עשוי להתיישן בלי לשנות את ההגדרה או את יחסי התלות שלו. לדוגמה, מקור אחזור של מאגר עשוי לעקוב אחרי סניף מסוים של מאגר של צד שלישי, ומחויבויות חדשות זמינות באותו סניף. במקרה כזה, אפשר לבקש מהמאגר להשתמש שוב במאגרים חיצוניים ללא תנאי. לשם כך, עליכם להתקשר אל bazel sync
.
בנוסף, חלק מהכללים בודקים את המכונה המקומית ועשויים להיות מיושנים אם המכונה המקומית שודרגה. כאן אפשר לבקש מה-Bazal לשלוף מחדש את המאגרים החיצוניים האלה, שבהם ההגדרה repository_rule
מוגדרת עם המאפיין configure
, באמצעות bazel sync --configure
.
דוגמאות
כלי +C+ המוגדר אוטומטית: הוא משתמש בכלל מאגר כדי ליצור באופן אוטומטי את קובצי התצורה של C++ עבור Bazel, על ידי חיפוש המהדר המקומי C++ , הסביבה וסימונים שה-C+ + תומך.
מאגרי Go משתמשים במספר
repository_rule
כדי להגדיר את רשימת יחסי התלות הנדרשים כדי להשתמש בכללי Go.rules_jvm_external יוצרת מאגר חיצוני בשם
@maven
כברירת מחדל, שיוצר יעדי build לכל פריט מידע שנוצר בתהליך פיתוח (Attribution) בעץ העץ של Maven.