שאלות נפוצות

בכל שאלה ועניין, אפשר לפנות אל עזרה.

מה זה Bazel?

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

מה מיוחד ב-Bazel?

Bazel נועדה להתאים את אופן הפיתוח של התוכנה ב-Google. הוא כולל את התכונות הבאות:

  • תמיכה בשפות מרובות: Bazel תומכת בשפות רבות וניתן להרחיב אותה כך שתתמוך בשפות תכנות שרירותיות.
  • שפת build ברמה גבוהה: פרויקטים מתוארים בשפה הBUILD, פורמט תמציתי של טקסט שמתאר פרויקט כסדרות של ספריות קטנות, קבצים בינאריים ובדיקות. לעומת זאת, בעזרת כלים כמו 'לעשות', צריך לתאר קבצים בודדים ולהפעיל את המהדרים.
  • תמיכה בפלטפורמות מרובות: אותו כלי ואותם קבצים מסוג BUILD יכולים לשמש לפיתוח תוכנה לארכיטקטורה שונה, ואפילו לפלטפורמות שונות. אנחנו ב-Google משתמשים ב-Bazel כדי לבנות מגוון רחב של אפליקציות, משרתים שפועלים במערכות שבמרכזי הנתונים שלנו ועד לאפליקציות של לקוחות שעובדות בטלפונים ניידים.
  • יכולת הפעלה מחדש: ב-BUILD קבצים, כל ספרייה, בדיקה ובינארי צריכים לציין את התלות הישירות שלהם. Bazel משתמשת במידע התלוי הזה כדי לדעת מה צריך לבנות מחדש כשמבצעים שינויים בקובץ מקור, ואילו משימות יכולות לפעול במקביל. כלומר, כל ה-buildים מצטבר ותמיד יניבו את אותה תוצאה.
  • יכולת התאמה: Bazel יכולה להתמודד עם מבנים גדולים; ב-Google, בדרך כלל קובץ הבינארי של השרת מכיל 100,000 קובצי מקור, והוא בונה אתרים שבהם לא נערכו שינויים בקבצים למשך כ-200 אלפיות השנייה.

למה Google לא משתמשת...

  • יצרנית: נינג'ה: כלים אלה מאפשרים שליטה מדויקת על הפקודות שמופעלות ליצירת קבצים, אבל המשתמשים צריכים לכתוב כללים נכונים.
    • המשתמשים משתמשים ב-Bazel ברמה גבוהה יותר. לדוגמה, ב-Bazel יש כללים מובנים ל"בדיקת Java", ל"בינארי + C+" ולרעיונות כמו "פלטפורמת יעד" ו"פלטפורמת מארח". הכללים האלה נבדקו בקרבות שהם בלתי נודעים.
  • נמלה ו-Maven: הנמלה ו-Maven מיועדות בעיקר ל-Java, ואילו Bazel מטפלת בכמה שפות. ב-Bazel מעודדת חלוקת משנה של בסיסי קוד ביחידות קטנות ורב-פעמיות, והיא יכולה לבנות מחדש רק את אלה שצריך לבנות מחדש. הפעולה הזו מזרזת את הפיתוח בעבודה עם בסיסי קוד גדולים יותר.
  • גראדל: קובצי תצורה של Bazel מובנים הרבה יותר מאלה של Gradle, ומאפשרים ל-Bazel להבין בדיוק מה כל פעולה עושה. ההגדרה הזו מאפשרת הצבה מקבילה יותר ויכולת שחזור טובה יותר.
  • מכנסיים, באק: שני הכלים נוצרו ו פותחו על ידי גוגלרים לשעבר ב-Twitter וב-Foursquare, ו-Facebook בהתאמה. המודלים האלה נוצרו אחרי ב-Bazel, אבל קבוצות התכונות שלהם שונות, כך שהן לא חלופיות חלופיות מעשיות עבורנו.

מאיפה באזל?

Bazel הוא טעם של הכלי ש-Google משתמשת בו כדי לבנות את תוכנת השרת שלה באופן פנימי. היא הורחבה כדי לבנות גם תוכנות אחרות, כמו אפליקציות לנייד (iOS ו-Android) שמתחברות לשרתים שלנו.

האם כתבת מחדש את הכלי הפנימי כקוד פתוח? האם זה מזלג?

Bazel משתפת את רוב הקוד שלה עם הכלי הפנימי, והכללים שלה משמשים למיליוני גרסאות build מדי יום.

למה Google בנה את Bazel?

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

האם Bazel דורשת אשכול של build?

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

איך מתנהל תהליך הפיתוח של Google?

עבור בסיס קוד השרת שלנו, אנחנו משתמשים בתהליך העבודה הבא לפיתוח:

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

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

רקע נוסף על תהליך הפיתוח ב-Google זמין בבלוג כלים של eng.

למה פתחת את Bazel?

תוכנת הבנייה צריכה להיות מהנה וקלה. גרסאות build איטיות ולא צפויות מבטלות את התכנות.

למה כדאי להשתמש ב-Bazel?

  • Bazel יכולה לקצר את זמני הבנייה שלך מפני שהיא יכולה לחבר מחדש רק את הקבצים שצריך להדר מחדש. באופן דומה, הוא יכול לדלג על בדיקות חוזרות שבוצעו, אם ידוע שהוא לא השתנה.
  • Bazel מפיקה תוצאות דקורטיביות. הוא עוזר למנוע הטיה בין גרסאות build נקיות, מחשבים ניידים ומערכות CI וכו'.
  • Bazel יכולה לבנות אפליקציות לקוח ושרת שונות באמצעות אותו כלי מאותו סביבת עבודה. לדוגמה, אפשר לשנות פרוטוקול מסוג לקוח/שרת בהתחייבות יחידה, ולבדוק שהאפליקציה העדכנית לנייד פועלת עם השרת המעודכן. שני הכלים מבוססים על אותו הכלי, כך שניתן ליהנות מכל היתרונות שמוזכרים ב-Bazel.

האם אפשר לראות דוגמאות?

כן; ניתן לעיין בדוגמה פשוטה או לקרוא את קוד המקור של Bazel לקבלת דוגמה מורכבת יותר.

מה הכי טוב ב-Bazel?

Bazel מבליטה פרויקטים ובדיקה של נכסים בעזרת המאפיינים הבאים:

  • פרויקטים עם בסיס קוד גדול
  • פרויקטים הכתובים בשפות מרובות
  • פרויקטים שנפרסים בכמה פלטפורמות
  • פרויקטים עם בדיקות מקיפות

היכן אוכל להריץ Bazel

Bazel פועלת ב-Linux, ב-macOS (OS X) וב-Windows.

ניוד לפלטפורמות יוניקס אחרות צריך להיות קל יחסית, כל עוד JDK זמין לפלטפורמה.

למה לא להשתמש ב-Bazel?

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

עד כמה יציבה התכונה של Bazel?

בתכונות הליבה (כללי C++ , Java וכללי מעטפת) נעשה שימוש נרחב ב-Google, לכן הן נבדקות בקפידה ויש מעט מאוד נטישה. באופן דומה, אנחנו בודקים גרסאות חדשות של Bazel במאות אלפי יעדים בכל יום כדי לאתר רגרסיות, ואנחנו משיקים גרסאות חדשות כמה פעמים בכל חודש.

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

עד כמה יציב של Bazel בפורמט בינארי?

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

איך מתחילים להשתמש ב-Bazel?

איך מתחילים

האם הבעיה ב-Docker פותרת את בעיות השחזור?

ב-Docker, תוכלו ליצור בקלות ארגזי חול עם גרסאות קבועות של מערכת ההפעלה, כמו Ubuntu 12.04 ו-Fedora 21. פעולה זו פותרת את בעיית השחזור של סביבת המערכת – כלומר, "איזו גרסה של /usr/bin/c++ is need my? "

ב-Docker לא ניתן לשחזר שחזור ביחס לשינויים בקוד המקור. גם אם תוסיפו את יצרן הכלי (Doiper) בתוך מאגר Docker בצורה לא מושלמת, עדיין תוכלו לקבל תוצאות בלתי צפויות.

בתוך Google, אנחנו בודקים כלים לבקרת מקור כדי לשחזר אותם. באופן כזה נוכל לבדוק שינויים בכלים ("שדרוג GCC ל-4.6.1") באותו מנגנון כמו שינויים בספריות בסיסיות ("תיקון גבולות בדיקה ב-OpenSSL").

האם אפשר לבנות קבצים בינאריים לפריסה ב-Docker?

עם Bazel תוכלו לבנות קבצים בינאריים עצמאיים המקושרים באופן סטטי ב-C/C++ , ועם קובצי צ'אט עצמאיים ב-Java. הכללים האלה תלויים במידה מועטה במערכות UNIX רגילות, ולכן ההתקנה שלהם צריכה להיות פשוטה בתוך מאגר אביזר עגינה.

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

האם אפשר ליצור תמונות ב-Docker באמצעות Bazel?

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

האם Bazel תגדיר את גרסאות ה-build שלי באופן אוטומטי?

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

  • אין להשתמש תלויות שלא הצהירו עליהן. הפעלה במצב ארגז חול (–spawn_strategy=sandboxed, רק ב-Linux) יכולה לעזור למצוא יחסי תלות לא מוצהרים.
  • אין לאחסן חותמות זמן ומזהי User-ID בקבצים שנוצרו. קובצי ZIP וארכיונים אחרים נוטים במיוחד לכך.
  • יש להימנע מהתחברות לרשת. גם הפעלה בארגז חול יכולה לעזור כאן.
  • הימנע מתהליכים שמשתמשים במספרים אקראיים, ובפרט מעבר למילון אקראי, בשפות תכנות רבות.

יש לך גרסאות בינאריות?

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

אני משתמש ב-Eclipse/IntelliJ/XCode. איך Bazel משתמשת ב-IDE?

בשביל IntelliJ, כדאי לעיין בפלאגין של IntelliJ עם Bazel.

ב-XCode, כדאי לנסות את Tulsi.

ל-Eclipse, כדאי לעיין בפלאגין E4B.

לגבי IDE אחרים, עיינו בפוסט בבלוג לגבי האופן שבו יישומי הפלאגין האלה פועלים.

אני משתמש ב-Jenkins/circleCI/TravisCI. איך מתנהלת האינטראקציה של Bazel עם מערכות ה-CI?

Bazel מחזירה קוד יציאה שאינו אפס אם הפעלת ה-build או הבדיקה נכשלת, ומצב זה מספיק לשילוב CI בסיסי. מאחר ש-Bazel לא זקוק לגרסאות build נקיות לתקינות, אין להגדיר את מערכת ה-CI לפני הניקוי לפני התחלת ה-build/בדיקה.

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

אילו תכונות עתידיות צפויות להופיע ב-Bazel?

יש לעיין במפות הדרכים שלנו.

האם אפשר להשתמש ב-Bazel בפרויקט INSERT LANGUAGE HERE?

Bazel ניתן להרחבה. כל אחד יכול להוסיף תמיכה בשפות חדשות. שפות רבות נתמכות. אפשר לעיין ברשימה של ההמלצות באנציקלופדיה לבניית ובכתובת awesomebazel.com תמצאו רשימה מקיפה יותר.

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

האם אפשר לתרום לבסיס הקוד של Bazel?

כדאי לעיין בהנחיות שלנו בנושא תרומת תוכן.

למה לא כל הפיתוחים מתרחשים בפתיחה?

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

סיימתם לקנות קוד פתוח?

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

  • רבות מהבדיקות של היחידות והשילובים שלנו (מה שצריך לשפר את התיקונים).
  • שילוב מלא.

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

האם יש חלקים מ-Bazel שמעולם לא נוצרו בקוד פתוח?

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

איך אפשר ליצור קשר עם הצוות?

אפשר לפנות אלינו בכתובת bazel-דיון@googlegroups.com.

איך מדווחים על באגים?

פותחים בעיה ב-GitHub.

מה קורה עם המילה "Blaze" בבסיס הקוד?

זהו שם פנימי לכלי. יש להתייחס ל-Bazel כ-Bazel.

למה פרויקטים אחרים של Google (Android ו-Chrome) משתמשים בכלים אחרים לבניית גרסאות?

עד להשקת הגרסה הראשונה (אלפא), Bazel לא הייתה זמינה באופן חיצוני, ולכן לא ניתן היה להשתמש בפרויקטים של קוד פתוח כמו Chromium ו-Android. בנוסף, הבעיה המקורית בתמיכה ב-Windows הייתה בעיה בבניית אפליקציות של Windows, כמו Chrome. הפרויקט התבגר והפך ליציב יותר, ולכן פרויקט הקוד הפתוח של Android נמצא בתהליך העברה ל-Bazel.

איך מבטאים 'Bazel'?

בדיוק כמו "בזיליקום" (צמחי תבלין) באנגלית אמריקאית: "BAY-zel". שם השיר מחורז. IPA: /`beyourdomainz⌋l/