الانتقال إلى المحتوى الرئيسي
الوحدة 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 (يُستخدم أيضًا للتحكم في ميزات اللغة المسموح بها، على سبيل المثال، range-over-func في 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. الجزء المثير للاهتمام هو الإصدار الرئيسي 2+:

  • الرائد v0 و v1 → المسار العادي: github.com/foo/bar.
  • التخصص 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 وتحتوي على مجلد فرعي للأدوات المساعدة. قم باستيراد الحزمة الفرعية بشكل رئيسي باستخدام المسار الكامل.

جارٍ تحميل المحرر…
إظهار التلميح

مسار الاستيراد هو اسم الوحدة (من go.mod) بالإضافة إلى المسار النسبي للمجلد.

الحل متاح بعد 3 من المحاولات

تمرين#go.m9.l4.e2
المحاولات: 0جارٍ التحميل…

قم بتحويل الواردات الفردية إلى مجموعة استيراد باستخدام صيغة الاستيراد (...) واستيراد كل من fmt وos.

جارٍ تحميل المحرر…

الحل متاح بعد 3 من المحاولات

Quiz#go.m9.l4.e3
جاهز

ما الأمر الذي يزيل التبعيات التي لم تعد مستوردة من go.mod ويضيف التبعيات المفقودة؟

Go
$ go mod ???
خيارات الإجابة