مقدمة: لماذا قد تحتاج إلى commit "حي"
\nهل سبق لك أن كتبت كودًا بلغة Go، وقمت بتوصيل مكتبة عبر go get، ثم اكتشفت أن مؤلفها أصلح خطأً حرجًا، لكنه لم يصدر علامة (release) جديدة بعد؟ أو ربما تقوم أنت بتطوير مكتبة وتريد اختبارها في المشروع الرئيسي قبل نشر الإصدار؟
في وحدات Go، هناك ميزة رائعة: يمكنك تحديد في go.mod ليس فقط رقم الإصدار (v1.2.3)، بل commit محدد من مستودع Git. هذا يسمح لك بالعمل مع أحدث إصدار من الكود، حتى لو لم يكن مغلفًا بعلامة إصدار بعد.
هذه المقالة هي ترجمة وتكييف لأحد أكثر الأسئلة شيوعًا على Stack Overflow في عالم Go. سنشرح كيفية القيام بذلك بشكل صحيح، وما هي المخاطر المحتملة، وكيف لا تفسد بناءك.
\n\nما هو go.mod ولماذا نحتاج إلى commits فيه؟
\ngo.mod هو ملف موجود في جذر مشروع Go الخاص بك. يصف جميع التبعيات (الوحدات) التي يحتاجها تطبيقك. عادةً ما تبدو الأسطر هكذا:
require (\n github.com/someuser/somelib v1.2.3\n)\nلكن ماذا لو كانت الميزة التي تحتاجها غير موجودة في v1.2.3، ولكنها موجودة فقط في آخر commit على الفرع main؟ في Go، يتم حل ذلك باستخدام pseudo-versions.
ما هو pseudo-version؟
\nهو سلسلة نصية خاصة تحل محل رقم الإصدار العادي. تتكون من:
\n- \n
- الإصدار الأساسي (إذا كان هناك علامة تفرعت منها) \n
- وقت الـ commit (بتنسيق
yyyymmddhhmmss) \n - هاش الـ commit (أول 12 حرفًا) \n
مثال: v0.0.0-20250320120000-abc123def456
لا تخف من هذه السلسلة الطويلة - فالأداة go هي التي تولدها دائمًا تقريبًا.
الطريقة رقم 1: استخدام go get مع العلم @latest
\nهذه هي الطريقة الأسهل والأكثر أمانًا. أنت فقط تقول لـ Go: "خذ أحدث إصدار من المستودع".
\nالخطوة 1: افتح الطرفية (Terminal) في جذر مشروعك.
\nالخطوة 2: نفذ الأمر التالي:
\ngo get github.com/someuser/somelib@latest\nبعد ذلك، سيقوم Go بما يلي:
\n- \n
- تنزيل آخر commit من الفرع الافتراضي (عادةً
mainأوmaster). \n - توليد pseudo-version. \n
- تحديث
go.modوgo.sumتلقائيًا. \n
النتيجة في go.mod:
require (\n github.com/someuser/somelib v0.0.0-20250320120000-abc123def456\n)\nتم! لقد قمت للتو بربط المشروع بأحدث commit.
\n\nإذا كنت بحاجة إلى تحديد هاش commit محدد
\nإذا كنت تعرف الهاش الدقيق (مثل abc123def456789)، يمكنك إدخاله مباشرة:
go get github.com/someuser/somelib@abc123def456789\nسيقوم Go بتحويله إلى pseudo-version.
\n\nالطريقة رقم 2: التحرير اليدوي لملف go.mod
\nأحيانًا تحتاج إلى تحرير الملف يدويًا (مثلًا إذا لم يكن لديك وصول إلى الطرفية أو كنت تكتب سكريبت CI).
\nالخطوة 1: افتح go.mod في أي محرر نصوص.
الخطوة 2: ابحث عن السطر الذي يحتوي على التبعية المطلوبة واستبدل الإصدار بـ latest أو بهاش محدد.
require (\n github.com/someuser/somelib latest\n)\nالخطوة 3: احفظ الملف ونفذ في الطرفية:
\ngo mod tidy\nالأمر go mod tidy سيقوم بسحب التبعيات المفقودة، وإزالة الزائدة، واستبدال كلمة latest بـ pseudo-version الفعلي.
هام: إذا قمت بكتابة الهاش يدويًا (مثل v0.0.0-abc123def456)، فقد يظهر خطأ من Go. من الأفضل دائمًا تشغيل go mod tidy بعد التعديلات اليدوية.