"لقد قمت بتثبيت حزمة، لكن لا أستطيع حذفها!" — قصة مألوفة؟
\n\nهل بدأت للتو في تعلم لغة Go، ووجدت مكتبة رائعة على GitHub، وكتبت الأمر go get github.com/example/package — ونجح كل شيء! ولكن مع مرور الوقت، يتغير مشروعك وتدرك أن هذه الحزمة لم تعد ضرورية. تبحث عن أمر go remove أو go uninstall، ولكن... ببساطة لا يوجد.
مرحبًا بك في عالم Go، حيث حذف الحزم ليس مجرد زر، بل مغامرة صغيرة. في هذا المقال، سنفهم أين تذهب الحزم بعد go get، وكيف "نطردها" بشكل صحيح، ولماذا صُمم Go بهذه الطريقة. تلميح: بعد القراءة، ستتوقف عن الخوف من الفوضى في النظام وستتعلم كيفية الحفاظ على مشاريعك نظيفة.
كيف يعمل go get: شرح مختصر
\n\nقبل أن نحذف، دعنا نفهم أين تذهب الحزمة بالضبط. في Go (قبل الإصدار 1.16، ولكن هذه المعرفة لا تزال مفيدة)، كان الأمر go get يقوم بتنزيل الكود المصدري للحزمة في مجلدين:
- \n
$GOPATH/src— الكود المصدري للحزمة (كما لو كنت قد استنسخت المستودع)؛ \n $GOPATH/pkg— الملفات الكائنية المترجمة (.a). \n
إذا كنت تستخدم Go modules (وهو الوضع الافتراضي منذ الإصدار 1.16)، فإن go get يعمل بشكل مختلف: فهو يضيف التبعية إلى ملف go.mod ويقوم بتنزيل الوحدة في الكاش ($GOPATH/pkg/mod).
المشكلة هي أنه لا يوجد أمر مدمج في Go لحذف حزمة. يعتقد مطورو اللغة أنه إذا لم تعد الحزمة ضرورية لك — فقط لا تستوردها في الكود. يبدو هذا منطقيًا، ولكن ماذا لو كنت تريد تحرير مساحة أو ترتيب الأمور؟
\n\nالطريقة الأولى: go clean -i (للمشاريع القديمة بدون وحدات)
\n\nفي السابق (قبل عصر الوحدات)، كان هناك أمر go clean -i. كان يقوم بحذف الملفات المترجمة للحزمة من $GOPATH/pkg. لكنه لم يمس الكود المصدري. أي أنك كنت تحذف فقط القطع الأثرية الثنائية، لكن الكود نفسه كان يبقى في src.
# حذف الملفات المترجمة للحزمة\ngo clean -i github.com/example/package\n\n# الكود المصدري لا يزال هنا:\nls $GOPATH/src/github.com/example/package\n\nعمليًا، كان هذا غير مريح. لذلك في الإصدارات الحديثة من Go (بدءًا من 1.12)، تم إعلان go clean -i كأمر قديم. إذا كتبت go clean -i الآن، فإن Go سيتجاهل العلم -i وينفذ go clean العادي (حذف الملفات الكائنية في المشروع الحالي).
الطريقة الثانية: الحذف اليدوي من GOPATH (للمحترفين)
\n\nإذا كنت لا تزال تعمل بدون وحدات (أو تريد فقط تنظيف التراكمات القديمة)، فسيتعين عليك التصرف يدويًا. إليك الوصفة الكاملة:
\n\n- \n
- ابحث عن مكان
$GOPATHالخاص بك: \n
go env GOPATH\n\nعادةً ما يكون /home/user/go أو C:\\Users\\user\\go.
- \n
- احذف الكود المصدري: \n
rm -rf $GOPATH/src/github.com/example/package\n\n- \n
- احذف الملفات المترجمة (إذا كانت موجودة): \n
rm -rf $GOPATH/pkg/linux_amd64/github.com/example/package.a\n\n\n\n\nهام: المسار إلى ملف
\n.aيعتمد على نظام التشغيل والبنية الخاصة بك.linux_amd64هو مثال نموذجي. يمكنك معرفة المسار الدقيق عبرgo list -m، ولكن الأسهل هو حذف مجلد الحزمة بالكامل فيpkg.
هذه الطريقة تعمل، لكنها غير نظيفة. أنت تخاطر بحذف شيء مهم عن طريق الخطأ. بالإضافة إلى ذلك، إذا كانت الحزمة مستخدمة في مشاريع أخرى — فستتوقف عن العمل.
\n\nالطريقة الثالثة: النهج الحديث — go mod tidy
\n\nإذا كنت تستخدم Go modules (ويجب عليك استخدامها إذا بدأت التعلم في 2024)، فكل شيء أكثر أناقة. عندما تتوقف عن استيراد حزمة في الكود الخاص بك، فإنها تتوقف تلقائيًا عن الظهور في ملف go.mod. ولكن ماذا عن الملفات التي تم تنزيلها في الكاش؟ هنا يأتي دور الأمر go mod tidy.
# تنظيف التبعيات غير المستخدمة\ngo mod tidy\n\nيقوم هذا الأمر بما يلي:
\n- \n
- إزالة التبعيات غير المستخدمة من ملف
go.mod. \n - حذف الوحدات غير الضرورية من الكاش المحلي (
$GOPATH/pkg/mod). \n - تحديث ملف
go.sumليعكس التغييرات. \n
هذه هي الطريقة الموصى بها في Go الحديث. لا حاجة للحذف اليدوي، ولا حاجة لأوامر خاصة. فقط قم بتشغيل go mod tidy بانتظام في مشروعك.
الخلاصة: ماذا تختار؟
\n\nإليك ملخص سريع للطرق المذكورة:
\n| الطريقة | \nمتى تستخدمها | \nالمزايا | \nالعيوب | \n
|---|---|---|---|
go clean -i | \n مشاريع قديمة جدًا (قبل Go 1.12) | \nبسيطة وسريعة | \nلا تحذف الكود المصدري، قديمة | \n
| الحذف اليدوي | \nعند العمل بدون وحدات | \nتحكم كامل | \nخطيرة، قد تكسر مشاريع أخرى | \n
go mod tidy | \n المشاريع الحديثة (مع الوحدات) | \nآمنة، تلقائية، موصى بها | \nتتطلب استخدام الوحدات | \n
في النهاية، تذكر أن Go صُممت لتكون لغة بسيطة وفعالة. إذا كنت تستخدم الوحدات، فأنت في الجانب الآمن. فقط حافظ على نظافة مشروعك باستخدام go mod tidy، وستتجنب معظم المشاكل المتعلقة بإدارة الحزم.
هل لديك أسئلة أو تجارب مع حذف الحزم في Go؟ شاركنا في التعليقات!