Go يشتكي من go.mod؟ لماذا يحدث هذا وكيف يعمل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: الخوف المألوف لكل مبتدئ في Go

\n\n

لقد بدأت للتو في تعلم Go. الإلهام يغمرك، تكتب أول Hello, World!، تشغل go run main.go — وبدلاً من التحية ترى جدارًا أحمر من النص. العبارة الرئيسية التي تجعل قلبك يبرد: "go: go.mod file not found in current directory or any parent directory; see 'go help modules'".

\n\n

هل هذا مألوف؟ لا تقلق، لقد رأى هذا الخطأ كل من بدأ العمل مع Go بعد الإصدار 1.11. هذا ليس خطأ في المترجم ولا لعنة من الآلهة القديمة. هذه هي آلية نظام الوحدات في Go الصارمة ولكن العادلة. اليوم لن نعرض فقط كيفية إصلاحه (على الرغم من أننا سنفعل ذلك). سننظر "تحت الغطاء": سنفهم لماذا يطلب Go ملف go.mod، وكيف يبحث عنه، وماذا يحدث إذا لم يكن الملف موجودًا.

\n\n

بحلول نهاية المقال، لن تتخلص من الخطأ فحسب، بل ستفهم أيضًا فلسفة إدارة التبعيات في Go. هيا بنا!

\n\n

ما هو go.mod ولماذا يحتاجه Go؟

\n\n

تخيل أن go.mod هو جواز سفر مشروعك. في هذا الملف، يخزن Go ثلاثة أشياء رئيسية:

\n
    \n
  • اسم الوحدة (على سبيل المثال، example.com/myproject) — معرف فريد.
  • \n
  • إصدار Go الذي كُتب به المشروع.
  • \n
  • قائمة التبعيات — الحزم الخارجية التي تستخدمها وإصداراتها الدقيقة.
  • \n
\n\n

قبل ظهور الوحدات (في إصدارات Go < 1.11) كان الأمر مختلفًا. كان يجب تخزين الكود بدقة داخل مجلد $GOPATH/src. كان هذا غير مريح: لم يكن بإمكانك ببساطة استنساخ مستودع في أي مجلد وتشغيله. حل نظام الوحدات (Go modules) هذه المشكلة، مما جعل المشاريع قابلة للنقل ومعزولة.

\n\n

الآن ينظر Go إلى go.mod كحدود للمشروع. إذا لم يكن الملف موجودًا، يعتبر Go أنك تعمل خارج المشروع ويرفض تنفيذ الكود. هذا هو جذر خطأنا.

\n\n

كيف يبحث Go عن go.mod: خوارزمية "من الأسفل إلى الأعلى"

\n\n

عندما تكتب go run main.go، يبدأ Go في البحث عن go.mod وفقًا للخوارزمية التالية:

\n
    \n
  1. ابدأ من الدليل الحالي. إذا كان في المجلد الذي يحتوي على main.go ملف go.mod — رائع، نعمل.
  2. \n
  3. إذا لم يكن موجودًا — اصعد مستوى واحدًا للأعلى (إلى المجلد الأصلي). تحقق مرة أخرى.
  4. \n
  5. كرر الخطوة 2 حتى تصل إلى جذر نظام الملفات (/ على Linux/Mac أو C:\\ على Windows).
  6. \n
  7. إذا وصلت إلى الجذر ولم تجد go.mod — أخرج الخطأ "go.mod file not found in current directory or any parent directory".
  8. \n
\n\n

تسمى هذه الخوارزمية "walk up the directory tree". تسمح لك بتشغيل الكود من أي مجلد متداخل داخل المشروع. على سبيل المثال، إذا كان مشروعك موجودًا في /home/user/myapp/، ودخلت إلى /home/user/myapp/cmd/ وشغلت go build، سيجد Go ملف go.mod في /home/user/myapp/.

\n\n

مثال عملي: إعادة إنتاج الخطأ

\n\n

دعنا نحاكي الموقف. لننشئ ملفًا بسيطًا بدون وحدة:

\n\n
// main.go\npackage main\n\nimport "fmt"\n\nfunc main() {\n    fmt.Println("مرحبًا من عالم بدون go.mod!")\n}
\n\n

الآن لنجرب التشغيل:

\n
$ go run main.go\ngo: go.mod file not found in current directory or any parent directory; see 'go help modules'
\n\n

ها هو خطأنا. لقد مر Go بأمانة عبر جميع المجلدات من الحالي إلى الجذر، لكنه لم يجد go.mod. الحل واضح: يجب إنشاء هذا الملف.

\n\n

كيفية إصلاح الخطأ بشكل صحيح

\n\n

الطريقة 1: بداية سريعة مع go mod init

\n\n

الطريقة الأكثر صحة هي تهيئة الوحدة:

\n
$ go mod init example.com/myfirstapp\ngo: creating new go.mod: module example.com/myfir                

المدونات

توصيات الكتب