דילוג לתוכן המרכזי
מודול 9 · שיעור 4 מתוך 544/50 בקורס~12 min
שיעורי מודול (4/5)

לך מודולים

מודול Go הוא יחידה הניתנת לגרסה המורכבת מחבילה אחת או יותר. זה הבסיס של מערכת התלות המודרנית (Go 1.11+): לא עוד GOPATH, לא עוד vendor חובה, תלות מפורשת וניתנת לשחזור.

go.mod: מניפסט המודול

Code
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 פקודות.

פקודות חיוניות

Bash
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 graph

go 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.
Go
import "github.com/foo/bar/v2"

זה מאפשר לך לייבא גם את v1 וגם את v2 של אותה ספרייה בו-זמנית (שימושי במהלך העברות פרוגרסיביות).

ייבוא ​​נתיבים וחבילות פנימיות

אם המודול שלך הוא example.com/myapp, תת-תיקיית utils/ מיובאת כ:

Go
import "example.com/myapp/utils"

הנתיב תלוי רק בשם המוצהר ב-go.mod, לא במיקום בדיסק: אותו קוד בתיקייה אחרת ממשיך לעבוד.

מצב סביבת עבודה (Go 1.18+)

כדי לעבוד על מודולים מרובים שמתייחסים זה לזה בו-זמנית (למשל ספרייה ואפליקציה שמשתמשת בזה):

Bash
go work init ./lib ./app

זה יוצר go.work: go build ישתמש בגרסה המקומית של ./lib במקום להוריד את הגרסה שפורסמה. אין לבצע go.work (זוהי סביבת פיתוח).

תרגילים

פעילות גופנית#go.m9.l4.e1
ניסיונות: 0טוען...

המודול הוא example.com/myapp ומכיל תת-תיקיית utils. ייבא את חבילת המשנה ב-main באמצעות הנתיב המלא.

טוען עורך...
הצג רמז

נתיב הייבוא ​​הוא שם המודול (מ-go.mod) בתוספת הנתיב היחסי של התיקיה.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#go.m9.l4.e2
ניסיונות: 0טוען...

הפוך את הייבוא ​​הבודד לקבוצת ייבוא ​​עם תחביר הייבוא ​​( ... ), מייבא את ה-fmt וגם את OS.

טוען עורך...

הפתרון זמין לאחר 3 ניסיונות

Quiz#go.m9.l4.e3
מוכן

איזו פקודה מסירה תלויות שכבר לא מיובאות מ-go.mod ומוסיפה את החסרות?

Go
$ go mod ???
אפשרויות תשובה