סביבות עבודה, חבילות ויעדים

Bazel בונה תוכנה מקוד מקור המאורגן בעץ ספרייה בשם 'סביבת עבודה'. קובצי מקור בסביבת העבודה מאורגנים בהיררכיית קוננות של חבילות, שבה כל חבילה היא ספרייה שמכילה קבוצה של קובצי מקור קשורים וקובץ BUILD אחד. הקובץ BUILD מציין אילו פלטים של תוכנות ניתן לבנות מהמקור.

סביבת עבודה

סביבת עבודה היא עץ של ספריות במערכת הקבצים, שמכילה את קובצי המקור של התוכנה שאתם רוצים לבנות. בכל סביבת עבודה יש קובץ טקסט בשם WORKSPACE. יכול להיות שהיא ריקה או שהיא מכילה הפניות לתלות חיצוניות הנדרשות ליצירת הפלטים.

ספריות שמכילות קובץ בשם WORKSPACE נחשבות לשורש של סביבת עבודה. לכן, Bazel מתעלמת מכל עצי הספרייה בסביבת עבודה שמקורה בספריית משנה המכילה קובץ WORKSPACE, בזמן שהיא יוצרת סביבת עבודה נוספת.

Bazel תומך גם בקובץ WORKSPACE.bazel בתור כינוי של קובץ WORKSPACE. אם שני הקבצים קיימים, המערכת תשתמש ב-WORKSPACE.bazel.

מאגרי נתונים

הקוד מאורגן במאגרים. הספרייה שמכילה את הקובץ WORKSPACE היא הבסיס של המאגר הראשי, שנקרא גם @. מאגרים אחרים, (חיצוניים) מוגדרים בקובץ ה-WORKSPACE באמצעות כללי סביבת העבודה.

כללי סביבת העבודה הכלולים ב-Bazel מתועדים בקטע Workspace Rules ב- Build Encyclelopedia ובתיעוד שב הטמעת מאגר Starlark כללים.

מכיוון שמאגרים חיצוניים הם מאגרים בעצמם, לעתים קרובות הם מכילים גם קובץ WORKSPACE. עם זאת, Bazel מתעלמת מ-WORKSPACE קבצים נוספים אלה. בפרט, מאגרים שתלויים בהם באופן טרנזיטיבי לא נוספים באופן אוטומטי.

חבילות

היחידה הראשית של ארגון הקוד במאגר היא חבילה. חבילה היא אוסף של קבצים קשורים ומפרט כיצד אפשר להשתמש בהם כדי להפיק תוצרי פלט.

חבילה מוגדרת כספרייה המכילה קובץ בשם BUILD (או BUILD.bazel). חבילה כוללת את כל הקבצים שנמצאים בספרייה שלה, וכן כל ספריות המשנה שמתחתיה, חוץ מאלו שבקובץ עצמו BUILD. בהגדרה הזו, אף קובץ או ספרייה לא יכולים להיות חלק משתי חבילות שונות.

לדוגמה, בעץ הספריות הבא יש שתי חבילות, my/app וחבילת משנה my/app/tests. הערה: my/app/data אינה חבילה, אלא ספרייה ששייכת לחבילה my/app.

src/my/app/BUILD
src/my/app/app.cc
src/my/app/data/input.txt
src/my/app/tests/BUILD
src/my/app/tests/test.cc

יעדים

חבילה היא מאגר של יעדים, המוגדרים בקובץ ה- BUILD של החבילה. רוב היעדים הם אחד משני סוגים עיקריים, קבצים וכללים.

הקבצים מחולקים עוד יותר לשני סוגים. קובצי מקור בדרך כלל נכתבים במאמציהם של אנשים, ונבדקים במאגר. קבצים שנוצרו, שנקראים לפעמים קבצים נגזרים או קובצי פלט, לא נבדקים במערכת, אבל נוצרים מקובצי מקור.

הצהרה על סוג היעד השני מתבצעת באמצעות כלל. כל מופע של כלל מציין את הקשר בין קבוצת קלט לקבוצת קבצים של פלט. הקלט לכלל עשוי להיות קובצי מקור, אך הוא עשוי גם להיות פלט של כללים אחרים.

אם הקלט לכלל הוא קובץ מקור או קובץ שנוצר, ברוב המקרים הוא בלתי מהותי; מה שחשוב הוא רק התוכן של הקובץ הזה. עובדה זו מקלה על החלפת קובץ מקור מורכב בקובץ שנוצר על ידי כלל, כמו במקרה שבו הנטל של קובץ ידני בעל מבנה מובנה מאוד מעייף מדי, ומישהו כותב כדי להסיק אותו. הצרכנים לא יצטרכו לעשות שום שינוי. לעומת זאת, קובץ שנוצר יוחלף בקלות בקובץ מקור עם שינויים מקומיים בלבד.

הקלט לכלל עשוי לכלול גם כללים אחרים. לעתים קרובות, המשמעות המדויקת של קשרי גומלין אלה היא די מורכבת ותלויה בשפה או בכללים, אך באופן אינטואיטיבי היא פשוטה: כלל ספרייה C++ עשוי לכלול כלל ספרייה C++ נוסף עבור קלט. ההשפעה של תלות זו היא שקובצי הכותרות של B זמינים ל-A במהלך ההידור, סמלים של B זמינים ל-A במהלך הקישור, ונתוני זמן הריצה של B זמינים ל-A במהלך ההפעלה.

גורם אחד לכל הכללים הוא שהקבצים שנוצרו על ידי כלל שייכים תמיד לאותה חבילה של הכלל עצמו. אין אפשרות ליצור קבצים בחבילה אחרת. עם זאת, לעתים קרובות, קלט של כללים מגיע מחבילה אחרת.

קבוצות חבילות הן קבוצות של חבילות שמטרתן להגביל את הנגישות של כללים מסוימים. קבוצות חבילות מוגדרות על ידי הפונקציה package_group. הן כוללות שלושה נכסים: רשימת החבילות שהם מכילים, שמם וקבוצות חבילות אחרות שהם כוללים. הדרכים המותרות ביותר להתייחס אליהן הן מהמאפיין visibility של כללים או מהמאפיין default_visibility של הפונקציה package; הם לא יוצרים או צורכים קבצים. למידע נוסף, יש לעיין ב תיעוד של package_group.

תוויות