שיעורי מודול (4/5)
לך מודולים
מודול Go הוא יחידה הניתנת לגרסה המורכבת מחבילה אחת או יותר. זה הבסיס של מערכת התלות המודרנית (Go 1.11+): לא עוד GOPATH, לא עוד vendor חובה, תלות מפורשת וניתנת לשחזור.
go.mod: מניפסט המודול
module example.com/myapp
go 1.22
require (
github.com/google/uuid v1.6.0
golang.org/x/time v0.5.0
)
שלוש הנחיות עיקריות:
module <path>— נתיב הייבוא של המודול. כל החבילות הפנימיות מיובאות כ-example.com/myapp/sub/pkg. זה לא חייב להיות כתובת URL אמיתית, אבל כדי לפרסם דרךgo getזה חייב לפתור.go <version>- גרסת ה-Go המינימלית הנדרשת (משמשת גם כדי לשלוט באילו תכונות שפה מותרות, למשל טווח-על-פונקציה ב-1.23).require- התלות הישירות עם הגרסה המדויקת שלהן.
הנחיות נוספות: replace (מחליף שקע במזלג או נתיב מקומי), exclude, retract.
go.sum: קובץ הנעילה ההצפנה
לצד go.mod, go.sum מכיל גיבוב קריפטוגרפי של כל גרסה שהורדת (כולל תלות טרנזיטיבית). זה מבטיח אפשרות לשחזור: אם מישהו מתעסק בגרסה שפורסמה, הבנייה נכשלת.
תמיד בצע את זה. הוא מתעדכן אוטומטית על ידי go פקודות.
פקודות חיוניות
go mod init example.com/myapp # create go.mod
go get github.com/google/uuid # add the dep at its latest version
go get github.com/google/uuid@v1.5.0 # specific version
go get -u ./... # upgrade every dep
go mod tidy # remove unused deps, add missing ones
go mod download # download everything into the cache
go mod why github.com/x/y # explain why a dep is included
go mod graph # full dependency graphgo mod tidy הוא זה שאתה מפעיל אחרי כל שינוי ביבוא: הוא מבטיח שgo.mod משקף בדיוק את החבילות בהן נעשה שימוש בפועל.
גירסאות ייבוא סמנטי (SIV)
הגרסאות עוקבות אחר SemVer: v1.2.3 = MAJOR.MINOR.PATCH. החלק המעניין הוא major v2+:
- מייג'ור
v0וv1→ נתיב רגיל:github.com/foo/bar. - Major
v2או מאוחר יותר → הנתיב כולל את הגרסה הראשית:github.com/foo/bar/v2.
import "github.com/foo/bar/v2"זה מאפשר לך לייבא גם את v1 וגם את v2 של אותה ספרייה בו-זמנית (שימושי במהלך העברות פרוגרסיביות).
ייבוא נתיבים וחבילות פנימיות
אם המודול שלך הוא example.com/myapp, תת-תיקיית utils/ מיובאת כ:
import "example.com/myapp/utils"הנתיב תלוי רק בשם המוצהר ב-go.mod, לא במיקום בדיסק: אותו קוד בתיקייה אחרת ממשיך לעבוד.
מצב סביבת עבודה (Go 1.18+)
כדי לעבוד על מודולים מרובים שמתייחסים זה לזה בו-זמנית (למשל ספרייה ואפליקציה שמשתמשת בזה):
go work init ./lib ./appזה יוצר go.work: go build ישתמש בגרסה המקומית של ./lib במקום להוריד את הגרסה שפורסמה. אין לבצע go.work (זוהי סביבת פיתוח).
תרגילים
המודול הוא example.com/myapp ומכיל תת-תיקיית utils. ייבא את חבילת המשנה ב-main באמצעות הנתיב המלא.
הצג רמז
נתיב הייבוא הוא שם המודול (מ-go.mod) בתוספת הנתיב היחסי של התיקיה.
הפתרון זמין לאחר 3 ניסיונות
הפוך את הייבוא הבודד לקבוצת ייבוא עם תחביר הייבוא ( ... ), מייבא את ה-fmt וגם את OS.
הפתרון זמין לאחר 3 ניסיונות
איזו פקודה מסירה תלויות שכבר לא מיובאות מ-go.mod ומוסיפה את החסרות?
$ go mod ???