ترويض go get: تثبيت الحزم في Go للمبتدئين

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

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

ابدأ الدورة

لماذا تعطل "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\n

تاريخ موجز: من GOPATH إلى الوحدات النمطية

\n

قبل الإصدار Go 1.11، كان كل الكود يعيش في GOPATH — مجلد خاص يحتوي على جميع مشاريعك والحزم الخارجية. كان الأمر go get يقوم بتنزيل الكود المصدري مباشرة إليه. كان هذا مريحاً، لكنه تسبب في مشاكل مع الإصدارات: إذا تطلب مشروعان إصدارين مختلفين من نفس المكتبة — كانت تبدأ الفوضى.

\n

مع ظهور Go modules (بدءاً من Go 1.11 وبشكل مستقر من 1.16)، حصل كل مشروع على ملف go.mod خاص به — وهو ملف يحدد التبعيات وإصداراتها. الآن يعمل go get بشكل مختلف:

\n
    \n
  • يضيف التبعية إلى go.mod
  • \n
  • ينزلها إلى ذاكرة التخزين المؤقت (عادةً $GOPATH/pkg/mod)
  • \n
  • لا ينشئ ملفاً تنفيذياً في $GOPATH/bin
  • \n
\n

إذا كنت بحاجة إلى تثبيت برنامج جاهز (مثل أداة سطر أوامر) — استخدم go install.

\n\n

كيف يعمل go get الآن: تحليل خطوة بخطوة

\n

افتح الطرفية وأنشئ وحدة نمطية جديدة:

\n
mkdir myproject\ncd myproject\ngo mod init myproject
\n

الآن نريد إضافة، على سبيل المثال، المكتبة الشهيرة gorilla/mux لتوجيه الطلبات. في السابق كنا نكتب:

\n
go get github.com/gorilla/mux
\n

وهذا سيعمل — سيتم تنزيل المكتبة. لكن انظر ماذا حدث:

\n
    \n
  1. ظهر سطر في go.mod: require github.com/gorilla/mux v1.8.0
  2. \n
  3. ظهر ملف go.sum في مجلد المشروع — وهو ملف يحتوي على المجاميع الاختبارية للأمان
  4. \n
  5. الكود المصدري للمكتبة موجود في ذاكرة التخزين المؤقت، وليس بجانب المشروع
  6. \n
\n

الآن يمكنك استيراد الحزمة في الكود الخاص بك:

\n
package 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 لن يوفره لك.

\n\n

تثبيت الملفات التنفيذية: go install يسرع للمساعدة

\n

لنفترض أنك وجدت أداة رائعة مكتوبة بلغة Go، مثل golangci-lint — وهي أداة لتحليل الكود. لتثبيتها كأمر في النظام، كنت تكتب سابقاً:

\n
go get github.com/golangci/golangci-lint/cmd/golangci-lint
\n

هذا لن يعمل الآن (سيظهر تحذير). الطريقة الصحيحة:

\n
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
\n

ماذا سيحدث:

\n
    \n
  • سيقوم Go بتنزيل الكود المصدري للأداة
  • \n
  • سيقوم بتجميعه
  • \n
  • سيضع الملف التنفيذي الجاهز في $GOPATH/bin (أو $GOBIN إذا كان المتغير محدداً)
  • \n
\n

تأكد من أن $GOPATH/bin مضاف إلى PATH — وإلا فلن يكون الأمر متاحاً. يمكنك التحقق كالتالي:

\n
echo $GOPATH\n# عادةً /home/user/go\nls ~/go/bin/
\n

إذا كان ملفك التنفيذي موجوداً هناك — فكل شيء على ما يرام.

\n\n

الأخطاء النموذجية للمبتدئين (وكيفية تجنبها)

\n

على Stack Overflow، غالباً ما يُسأل عن هذه المشاكل:

\n