لماذا تعطل "go get" وكيف تصلح ذلك؟
\nإذا كنت قد تساءلت يوماً "How can I install a package with go get?" — فأنت لست وحدك. هذا السؤال حصد آلاف المشاهدات على Stack Overflow، وليس من دون سبب. في السابق، كان كل شيء بسيطاً: go get github.com/some/package — وتكون المكتبة في $GOPATH/src. لكن بعد إصدار Go 1.16، تغير كل شيء. الآن، لم يعد go get يقوم بتثبيت الحزم بالمعنى المألوف. بدلاً من ذلك، يقوم فقط بتحديث go.mod. أما لتثبيت الملفات التنفيذية (binaries)، فقد ظهر الأمر go install.
في هذه المقالة، سنفهم ما حدث، وكيفية تثبيت الحزم والتبعيات بشكل صحيح الآن، ولماذا يختلط الأمر على المبتدئين كثيراً. هيا بنا!
\n\nتاريخ موجز: من GOPATH إلى الوحدات النمطية
\nقبل الإصدار Go 1.11، كان كل الكود يعيش في GOPATH — مجلد خاص يحتوي على جميع مشاريعك والحزم الخارجية. كان الأمر go get يقوم بتنزيل الكود المصدري مباشرة إليه. كان هذا مريحاً، لكنه تسبب في مشاكل مع الإصدارات: إذا تطلب مشروعان إصدارين مختلفين من نفس المكتبة — كانت تبدأ الفوضى.
مع ظهور Go modules (بدءاً من Go 1.11 وبشكل مستقر من 1.16)، حصل كل مشروع على ملف go.mod خاص به — وهو ملف يحدد التبعيات وإصداراتها. الآن يعمل go get بشكل مختلف:
- \n
- يضيف التبعية إلى
go.mod\n - ينزلها إلى ذاكرة التخزين المؤقت (عادةً
$GOPATH/pkg/mod) \n - لا ينشئ ملفاً تنفيذياً في
$GOPATH/bin\n
إذا كنت بحاجة إلى تثبيت برنامج جاهز (مثل أداة سطر أوامر) — استخدم go install.
كيف يعمل go get الآن: تحليل خطوة بخطوة
\nافتح الطرفية وأنشئ وحدة نمطية جديدة:
\nmkdir myproject\ncd myproject\ngo mod init myproject\nالآن نريد إضافة، على سبيل المثال، المكتبة الشهيرة gorilla/mux لتوجيه الطلبات. في السابق كنا نكتب:
go get github.com/gorilla/mux\nوهذا سيعمل — سيتم تنزيل المكتبة. لكن انظر ماذا حدث:
\n- \n
- ظهر سطر في
go.mod:require github.com/gorilla/mux v1.8.0\n - ظهر ملف
go.sumفي مجلد المشروع — وهو ملف يحتوي على المجاميع الاختبارية للأمان \n - الكود المصدري للمكتبة موجود في ذاكرة التخزين المؤقت، وليس بجانب المشروع \n
الآن يمكنك استيراد الحزمة في الكود الخاص بك:
\npackage main\n\nimport (\n "fmt"\n "github.com/gorilla/mux"\n)\n\nfunc main() {\n r := mux.NewRouter()\n fmt.Println("Router created!")\n}\nنشغل go run main.go — كل شيء يعمل. لكن إذا كنت تريد الحصول على ملف تنفيذي (برنامج مُجمّع) — فإن go get لن يوفره لك.
تثبيت الملفات التنفيذية: go install يسرع للمساعدة
\nلنفترض أنك وجدت أداة رائعة مكتوبة بلغة Go، مثل golangci-lint — وهي أداة لتحليل الكود. لتثبيتها كأمر في النظام، كنت تكتب سابقاً:
go get github.com/golangci/golangci-lint/cmd/golangci-lint\nهذا لن يعمل الآن (سيظهر تحذير). الطريقة الصحيحة:
\ngo install github.com/golangci/golangci-lint/cmd/golangci-lint@latest\nماذا سيحدث:
\n- \n
- سيقوم Go بتنزيل الكود المصدري للأداة \n
- سيقوم بتجميعه \n
- سيضع الملف التنفيذي الجاهز في
$GOPATH/bin(أو$GOBINإذا كان المتغير محدداً) \n
تأكد من أن $GOPATH/bin مضاف إلى PATH — وإلا فلن يكون الأمر متاحاً. يمكنك التحقق كالتالي:
echo $GOPATH\n# عادةً /home/user/go\nls ~/go/bin/\nإذا كان ملفك التنفيذي موجوداً هناك — فكل شيء على ما يرام.
\n\nالأخطاء النموذجية للمبتدئين (وكيفية تجنبها)
\nعلى Stack Overflow، غالباً ما يُسأل عن هذه المشاكل:
\n- \n
- "go get لا ينشئ مجلد src"
المدونات
توصيات الكتب
اقرأ أيضًا