על פי המסורת, רוב חברות ההיי-טק בישראל משתמשות בטכנולוגיות של מיקרוסופט. ומסיבה זו, הבחירה הטבעית למערכות ניהול תצורה גם היא מגיעה מאותו הבית. בימים ההם, שרבים כבר הצליחו לשכוח זו הייתה תוכנת Source Safe. מכיוון שיכולותיה לא התאימו לקבוצות גדולות והשוק דרש פתרונות יותר מתוחכמים, לפני מספר שנים מיקרוסופט השיקה פתרון חדש ושמו – Team Foundation Server.
המערכת גדלה, השתפרה פלאים ונכון להיום היא אחת הפתרונות הנפוצים והנוחים לניהול תצורה עבור החברות המסתמכות יום-יום על מיקרוסופט לכל צרכי הפיתוח. פרט חשוב לזכור כאן, הוא ש- TFS, לעומת רוב הכלים האחרים שנמצאים היום בשוק, הוא לא רק כלי ניהול תצורה, אלא גם מערכת לניהול משימות, build server, כולל מודולים להרצת בדיקות אוטומטיות, ועוד לא מעט דברים אחרים, כלומר, נותן פתרון ALM (ניהול מחזור החיים של פרוייקט תוכנה) מלא מקצה לקצה. ובזאת נמצא הכוח העיקרי של TFS.
מדוע לעתים נדרש ניהול תצורה מבוזר
לעומת כל היתרונות שיש ל-TFS, קיימים גם דברים שמערכת זו לא תוכננה להתמודד איתם. אחד הדברים הוא עצם העובדה ש-TFS מבוססת שרת מרכזי ולכן מפתח לא מסוגל לעבוד בצורה חלקה כאשר אין תקשורת קבועה עם השרת. לצוותים מסוימים, שמפתחיהם לא נמצאים באותו אזור גאוגראפי או שמורכבים בחלקם מקבלני משנה - כאשר מחלקת IT, או שלא מעוניינת או שלא מסוגלת לתת פתרון הולם לחשיפת השרת לעולם מחוץ לפיירוול – זו מגבלה אשר, עלולה לגרום לפגיעה בפרודוקטיביות. נוסף על כך, רבים מאיתנו נמצאים לא מעט זמן בנסיעות שבמהלכן ערוצי התקשורת פשוט לא זמינים. גרסת ה-2012 של TFS פותרת חלק מהבעיה ע"י יכולת בשם Local Workspace שהיא תוספת נחמדה מאוד – המפתח מסוגל לערוך את הקוד שלו בלי תקשורת לשרת וכשהתקשורת חוזרת, לעשות check-in כאילו הניתוק לא קרה אף פעם. החיסרון הוא שבזמן שלא הייתה תקשורת עם השרת, השינויים כבר יכלו לגדול למימדים לא קטנים, ובמקום להיות קשורים לפיצ'ר ספציפי אחד, הם נהיים שינויים חובקי-עולם, בלי היסטוריה ואפשרות להבין מה שייך לאן.
כתוצאה, התמונה התקינה הבאה:
הופכת להיות משהו אחר, בלי אפשרות לשייך את השינויים למשימה מסויימת, גם אם המפתח זוכר מה התקוון בכל שינוי ושינוי:
הפתרון לבעיות דומות הוא עבודה בשיטת ניהול תצורה מבוזר (DVCS) ומסוף חודש ינואר, שנת 2013, TFS תומך גם באפשרות זו.
Git כלי מצוין, אך לניהול תצורה בלבד
כלי לניהול תצורה מבוזר הנפוץ ביותר בעולם הוא, ככל הנראה, git. כמות הפרוייקטים שמשתמשים בו פשוט עצומה: Linux kernel (שעבורו git נכתב), VLC, Ruby on Rails, Android ועוד רבים. אתרי קוד פתוח כמו GitHub ו-CodePlex נותנים שירותי הוסטינג ב-git. משתמשים בו אפילו לצרכי deployment.
האם זה לא מספיק בשביל להתחיל להשתמש בכלי הזה?
המציאות אומרת שלא. ושתי הסיבות העיקריות הן:
1. git נבנה ככלי command line עם גישה שונה לגמרי מהסבב של check-out – check-in הרגיל, ולמפתח שמרגיש נוח לעבוד מתוך הסביבה החמימה של Visual Studio די קשה לעשות את המעבר ולהתחיל להשתמש במשהו כל כך שונה, גם בעזרת כלים כמו Git Extensions שנותנים רמת אינטגרציה מסוימת.
2. גם לאחר ההתגברות על הבעיה הראשונה לעיל, די קשה לאמץ git בתוך חברה, במיוחד ארגון המתבסס על מוצרים של מיקרוסופט, מפני ש-git עושה טוב ואפילו טוב מאוד רק את החלק של ניהול תצורה, וזה ממש לא מספיק לכל חברה שמבקשת יותר (רמז – TFS). לכן קיימים פתרונות כמו git-tfs ו- git-tf, אבל הן לוקחות אותנו שוב לעולם ה-command line המאוד זר למפתח העכשווי הממוצע.
מיקרוסופט מחבקת את Git
לאור הביקוש הגדול, במיקרוסופט החליטו לאמץ את הבן-דוד החורג של TFS ולתמוך בו בצורה מלאה בגרסאות הבאות של TFS 2012. נכון להיום, התמיכה ניתנת בגרסת 2012.2 CTP של Visual Studio, שנמצאת כאן. לאחר התקנת העדכון, התוסף לעבודה עם git הופך לנגיש בגלריית ההרחבות של Visual Studio תחת השם Visual Studio Tools for Git:
מרגע שהתוסף מותקן, נוכל לפתוח כל פרוייקט של Visual Studio שממופה לרפוזיטורי של git ולראות שאפשרויות ה-git התווספו ללשונית ה-Team Explorer:
מה שמעניין אותנו כעת הוא לפתוח פרוייקט חדש. אז נכון, GitHub הוא אופצייה לגיטימית לגמרי, אבל הוא לא נותן את היכולות של TFS (לפחות לא את הרוב). לכן נשתמש ב-TFS, ולא סתם ב-TFS, אלא בגרסת הענן שלו. נכון להיום, זו גם האופצייה היחידה להשתמש באינטגרציה המלאה בין הכלים. מיקרוסופט מבטיחה כי בעתיד הלא רחוק קונפיגורציה כזו תיתמך גם בגרסת ההתקנה של Visual Studio Team Foundation Server.
ללכלך את הידיים
הפתיחה של פרויקט חדש ב-Team Foundation Service היא מחוץ לסקופ של מאמר זה, אך כל המידע הדרוש נמצא באתר שלו. השוני היחיד הוא שבזמן הוספת הפרוייקט צריכים לציין את git כ-version control.
לאחר יצירת פרוייקט חדש נרצה, כמובן, להגדיר משימות. ומיד נתחיל בראשונה מהן:
שהיא יצירת פרויקט.
מכאן נעבור ל-Visual Studio ונחברו לפרוייקט ב-TFS:
בלחיצה על OK יתבצע חיבור לענן וחלון האוטוריזציה יבקש להכניס את שם המשתמש והסיסמא. לאחר הכנסתם וזיהוי מוצלח, השרת יופיע ברשימת שרתי ה-TFS ותתאפשר האופציה להתחבר לפרוייקט:
זה הזמן ללחוץ על Clone:
ולספק את מיקום הפרוייקט החדש:
במצב של פרוייקט קיים הפקודה מייצרת העתק מקומי מלא של הרפוזיטורי בענן. כתוצאה מהפעלת הפקודה על רפוזיטורי ריק, העתקו יופיע על הדיסק המקומי. כלומר, ההתנהגות המוכרת לנו מ-git הרגיל, זה כמובן לא מפתיע כי המימוש של TFS git הוא... ה-git המוכר לנו.
כעת נוכל ליצור פרוייקט חדש בספריה זו. בחרתי את האופציה המתוחכמת ביותר – console application, שבעתיד, לאחר מאמצים רבים, תוכל להדפיס ללא שגיאות את השורה "It works!". הפרוייקט יווצר בספריה הקיימת של git:
מיד עם היווצרות הפרוייקט, השינויים הניתנים להכנסה לרפוזיטורי יופיעו בתוך ה-solution explorer:
ואם נלחץ על ה-Commit… מתוך context menu של solution, נעבור למסך ה-Team Foundation עם הרשימה של השינויים:
בנקודה זו חייבים להבין משהו מאוד חשוב: ההתנהגות של git תחת שליטה של Visual Studio היא לא ההתנהגות הרגילה שלו. למה? מכיוון ש-git מוסיף לרשימה לעיל לא רק את הקבצים המופיעים ב-Included Changes, אלא גם את כל אלה:
הדבר היחיד ש-git מכיר על הפרוייקט, הוא המיקום שלו. כל הקבצים, שלא נמצאים כבר בתוך הבסיס נתונים שלו, הם שינויים להכנסה מבחינתו. ה-Visual Studio מכיר את מבנה הפרוייקט ודואג להכניס רק את הקבצים הרלוונטיים. בכדי לא לשבור את ההתנהגות הטבעית, וזה חשוב בכדי לתמוך באנשים שיעבדו עם git לא דרך Visual Studio, נצטרך להכניס קובץ קונפיגורציה בשם .gitignore. לשם כך נלך ל- Team Explorer – Home à Settings à Git Settings ונלחץ על Add בתוך Repository Settings à Ignore File:
כתוצאה, יופיע הקובץ שמתאים לרוב הפרוייקטים הנוצרים ע"י Visual Studio, הנמצא בספריית השורש של הרפוזיטורי. בנוסף, נראה שרשימת ה-Untracked Files הצטמצמה פלאים:
את שני הקבצים נרצה להוסיף לרשימה שלנו על מנת להכניס אותם לרפוזיטורי.
בדומה ל-.gitignore נרצה להוסיף ובמידת הצורך לערוך את קובץ ה-.gitattributes עבור הפרויקט.
דבר נוסף שנרצה לשנות הוא פרטי המשתמש. הקונפיגורציה נמצאת ב-Global settings:
השינוי כמובן רלוונטי רק לאנשים שתמיד יעבדו תחת אותם פרטי הזיהוי. במקרה ומישהו משתתתף במספר פרויקטים ופרטי הזיהוי, כמו שם משתמש או כתובת הדואר האלקטרוני, שונים מאחד לשני, הגדרת פרטים אלה חייבת להיעשות בצורה ידנית (בשלב זה) בתוך קובץ config בספריה המוסתרת .git בתוך הרפוזיטורי:
מה שנשאר הוא לכתוב הערה מתאימה ולהכניס את השינויים לרפוזיטורי. נרצה גם לשייך את השינוי ל-work item ספציפי. לשם כך נציין את מספר ה-item בתוך ההערה:
נותר רק ללחוץ על כפתור ה-commit והשינוי ייכנס לרפוזיטורי המקומי.
וכאשר נלחץ על View Commits, נראה את השינוי בהיסטוריה:
כמובן, השינוי עוד לא הופץ לרפוזיטורי המרכזי. בכדי לעשות זאת, נרצה לעשות Push, אבל קודם נלחץ על Fetch מתחת לכותרת Incoming Commits בכדי לוודא שאין שינויים ברפוזיטורי המרכזי ביחס לרפוזיטורי מקומי. במקרה זה לא מצפות לנו הפתעות ובביטחה נוכל להפיץ את השינויים.
לאחר הפעולה נוכל ללכת ל-web interface ולראות שהשינוי מופיע כעת גם בשרת:
וה-task מוכן לסגירה.
קדימה, להסתעף!
הגיע הזמן להתקדם ולממש את הפונקציונליות העיקרית של הפרויקט. לשם כך נשתמש ביכולת הבולטת של git – branching. מכיוון שיצירת branch היא זולה מאוד ולא משפיעה כלל על גרסת הקוד בשרת, נרצה להשתמש ביכולת זו עבור כל אחד ואחד מה-features אותם נפתח במהלך הפרויקט. Visual Studio מאפשר לגשת לפעולה מתוך הלשונית ההראשית של Team Explorer:
בלחיצה על Branches נגיע לחלון בו נגיש הקישור New Branch המאפשרת לבצע את הפעולה:
וכתוצאה מאישור ברירות המחדל ולחיצה על Create Branch ניצור branch חדש ומיד נעבור אליו. ה-feature לא היה פשוט, אך בסופו של דבר מומש בהצלחה:
פעולת הכנסת השינויים לרפוזיטורי כבר מוכרת, רק שהפעם היא תתבצע ב-branch נפרד:
פעולת ההפצה (Push) תמיד תתבצע מה-branch הראשי, master, לכן נמזג את השינויים בחזרה. הפעולה נגישה מתוך הלשונית Branches:
ולאחר המיזוג נוכל לבצע את ההפצה בצורה הרגילה.
לסיכום
ניסיתי כאן בקצרה להציג את היכולות שמספקת אינטגרציית ה-git לתוך האקו-סיסטם של מיקרוסופט. לא נגעתי בתסריטים יותר מתקדמים של מיזוג, בפתרון ההתנגשויות, פעולות נוספות של git, אבל גם לא שמתי כמטרה לכתוב טיוטוריאל ל-git. למרות זאת אני מקווה שכל מי שקורא את המאמר יקבל טעימה מהפונקציונליות החדשה והטעם יהיה טוב. למרות שהכלי נמצא בשלב ה-CTP ולא כל האופציות חשופות דרך הממשק הוויזואלי, הוא מרגיש יציב ומוכן לשימוש. כל מי שחיכה לקבל שילוב טבעי של git בתוך Visual Studio – ההמתנה נגמרה. והפרט החשוב הוא שהשילוב לא נגמר בעוד source provider ל-Visual Studio, יש כאן איחוד של כלי תצורה DVCS נפלא ומערכת ALM המובילה בשוק. האם מישהו יוכל לבקש יותר מזה?
שאלות נוספות בנושא VIsual Studio ו- Git? כנסו לפורום ALM שלנו בעברית!

הפוסט נכתב ע”י מיכאל דונכין, יועץ בכיר בחברת CodeValue ומומחה בטכנולוגיות מיקרוסופט: #C, ++C, WPF, MEF ועוד. מיכאל הוא בעל וותק ונסיון רב בפיתוח כלים ושירותים לחברות שונות בטכנולוגיות מיקרוסופט ואחרות.
חברת CodeValue מתמחה ביישום והטמעת פתרונות תוכנה מבוססי מיקרוסופט ובכללן פתרונות מבוססי Azure, הענן של מיקרוסופט. החברה מונה כיום כ-60 עובדים בהם מומחי טכנולוגיה בעלי ניסיון רב , הנחשבים מובילים בתחומם ומוכרים כסמכות מקצועית, בקהיליית פיתוח התוכנה.