ציון יחסי תלות

אפליקציות שפועלות בסביבת זמן ריצה רגילה של Go 1.12 ומעלה יכולות להשתמש בכל חבילה שתואמת ל-linux/amd64.

ב-App Engine, כל הצהרות הייבוא בקוד Go צריכות לציין נתיבים מוחלטים. לדוגמה, אפשר להשתמש ב:

import "github.com/example/mypackage"

שימוש במודולים של Go

אנחנו ממליצים להשתמש במודולים של Go כדי לנהל את יחסי התלות באפליקציה שלכם ב-Go. אתם יכולים להמשיך להשתמש במצב GOPATH הישן יותר אם אתם לא מוכנים לעבור למודולים של Go.

החל מ-Go בגרסה 1.22 ואילך:

  • אי אפשר להשתמש ב-go get מחוץ למודול במצב GOPATH מדור קודם (GO111MODULE=off). למידע נוסף, ראו כלים.

  • מומלץ להשתמש בקובץ go.mod לניהול יחסי תלות. כדי להתקין תלות במהלך הפריסה, צריך לכלול קובץ go.mod באותה תיקייה שבה נמצא קובץ app.yaml. מידע נוסף על גרסאות Go ועל ניהול תלות בספריות ספקים זמין במאמרים GOPATH ומודולים.

כשפורסים את האפליקציה, App Engine משתמש בפקודה go build כדי ליצור את האפליקציה, והתהליך הזה תואם להתנהגות של Go. כדי לוודא שהאפליקציה שלכם משתמשת במצב module-aware, צריך לבצע את הפעולות הבאות בסביבת הפיתוח:

  • יוצרים את קובץ go.mod של המודול באותה ספרייה שבה נמצא קובץ app.yaml. ‫App Engine מחפש בספרייה הנוכחית ובספריות האב העוקבות עד שהוא מוצא קובץ go.mod.

    אם App Engine לא מוצא קובץ go.mod, הוא פועל במצב GOPATH.

  • אם מגדירים את משתנה הסביבה GO111MODULE, צריך לוודא שהערך של המשתנה מאפשר מצב module-aware. כשפורסים את האפליקציה, App Engine בודק את הסביבה שלכם כדי לאתר את GO111MODULE, וההתנהגות שלו תואמת להתנהגות של Go. ‫App Engine מחיל את הגדרת המשתנה GO111MODULE רק אם כללתם קובץ go.mod לאפליקציה.

  • ב-Go 1.12, אל תאתרו את ספריית האפליקציה בתיקייה $GOPATH/src. אם אפליקציית Go 1.12 שלכם נמצאת איפשהו בעץ התיקיות $GOPATH/src,‏ App Engine פועל במצב GOPATH גם אם הגדרתם קובץ go.mod לאפליקציה.

    ב-Go 1.13 ואילך, App Engine משתמש במצב module-aware כברירת מחדל, אלא אם GO111MODULE מבטל את ברירת המחדל או שקובץ go.mod לא קיים בספריית האפליקציה.

יחסי תלות של יצירת עותק מקוד של צד שלישי (vendoring)

בתהליך של יצירת עותק מקוד של צד שלישי (vendoring) מעתיקים את החבילות שהאפליקציה שלכם משתמשת בהן לספריית האפליקציות, במקום להוריד מודולים מהמקור שלהם בזמן תהליך ה-build. ‫Go מספקת את הפקודה go build כדי ליצור עותק מקוד של צד שלישי (vendoring) של החבילות שהאפליקציה צריכה לספרייה בשם vendor בתיקיית השורש של האפליקציה.

ב-Go 1.14 ואילך, אם תיקיית השורש של האפליקציה מכילה ספרייה בשם vendor, הפקודה go build ותהליך הפריסה של App Engine משתמשים בחבילות שבספריית הספקים במקום להוריד מודולים.

ב-Go 1.13 ובגרסאות קודמות, אפשר להשתמש ב-vendoring רק אם מגדירים את הסביבה לשימוש במצב GOPATH.

שימוש בתלות פרטית

‫App Engine לא יכול להוריד את התלות הפרטית שלכם במהלך תהליך הבנייה, לכן אתם צריכים לכלול את התלות בקוד האפליקציה בזמן הפריסה.

כדי להצהיר על יחסי תלות פרטיים, משתמשים בהנחיית replace בקובץ go.mod. בדוגמה הבאה נניח שהאפליקציה נמצאת בספרייה /myapp/:

  1. עוברים לספרייה של האפליקציה:

    cd /myapp
    
  2. יוצרים ספרייה שמכילה את התלות הפרטית:

    mkdir private
    

    מוודאים שהתלות הפרטית נמצאת בספרייה private. אחת הגישות היא ליצור קישור סמלי:

    mkdir private/private.example.com
    ln -s /path/to/private.example.com/foo private/private.example.com/foo
    
  3. צריך לעדכן את הקובץ go.mod כדי להשתמש בהנחיה replace ולהשתמש בספרייה private בשביל התלות:

    go mod edit -replace=private.example.com/foo=./private/private.example.com/foo
    

    קובץ go.mod אמור להיראות עכשיו כך:

    קובץ סופי go.mod

    module private.example.com/myapp
    
    require private.example.com/foo v1.2.3
    
    replace private.example.com/foo => ./private/private.example.com/foo
    

    קובץ go.mod מקורי

    module private.example.com/myapp
    
    require private.example.com/foo v1.2.3
    
  4. אל תשנו את האופן שבו אתם מייבאים את החבילה הפרטית ומשתמשים בה. ההצהרה import אמורה להיראות כך:

    import "private.example.com/foo"
    
  5. כדי לכלול את התלות הפרטית בפריסה, פורסים את האפליקציה:

    gcloud app deploy