دروس الوحدة (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 (يُستخدم أيضًا للتحكم في ميزات اللغة المسموح بها، على سبيل المثال، range-over-func في 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. الجزء المثير للاهتمام هو الإصدار الرئيسي 2+:
- الرائد
v0وv1→ المسار العادي:github.com/foo/bar. - التخصص
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 وتحتوي على مجلد فرعي للأدوات المساعدة. قم باستيراد الحزمة الفرعية بشكل رئيسي باستخدام المسار الكامل.
إظهار التلميح
مسار الاستيراد هو اسم الوحدة (من go.mod) بالإضافة إلى المسار النسبي للمجلد.
الحل متاح بعد 3 من المحاولات
قم بتحويل الواردات الفردية إلى مجموعة استيراد باستخدام صيغة الاستيراد (...) واستيراد كل من fmt وos.
الحل متاح بعد 3 من المحاولات
ما الأمر الذي يزيل التبعيات التي لم تعد مستوردة من go.mod ويضيف التبعيات المفقودة؟
$ go mod ???