اذهب إلى المحتوى

التعرف على GOPATH في لغة جو Go


هدى جبور

ستفهم في هذه المقالة ماذا يعني GOPATH وكيف يعمل وكيفية إعداده لأنها خطوة هامة عند إعداد بيئة التطوير، بالإضافة إلى فهم كيفية عثور جو على الملفات المصدرية وتثبيتها وإنشائها. في هذه المقالة سوف نستخدم GOPATH عند الإشارة إلى مفهوم بنية المجلد التي سنناقشها، كما سنستخدِم GOPATH$ للإشارة إلى متغير البيئة الذي سيستخدِمه جو للعثور على بنية المجلد.

تُعَدّ مساحة عمل جو Go Workspace الطريقة التي يدير بها جو ملفات المصدر والملفات الثنائية والكائنات المخزنة مؤقتًا التي ستُستخدَم في وقت لاحق لعمليات التصريف السريع، وعادةً ما تكون لديك مساحة عمل واحدة فقط، إذ من الممكن أن تكون لديك أكثر لكن يُستحسن واحدة فقط، كما يكون GOPATH هو مجلد الجذر لها.

انتبه إلى أنه بدءًا من الإصدار 1.13 أضاف مطوروا لغة Go آلية جديدة لإدارة المكتبات التي يعتمد عليها مشروع مكتوب بلغة جو تدعى وحدات جو Go Modules -سنتحدث عنها لاحقًا- وأصبحت هذه الآلية الطريقة المعتمد حاليًا في إضافة إعتماديات المشروع وإدارة هيكلة مجلده الرئيسي، وصحيح أن هذه الآلية قد حلت مكان GOPATH إلا أنه من الجيد فهم الآلية القديمة هذه التي قد تكون مستعملة في مشاريع قديمة أو تمر معك في شيفرة ما، ولمزيد من التفاصيل ومعرفة أحدث المستجدات عد إلى توثيق workspaces الرسمي من لغة جو.

ضبط متغير البيئة GOPATH$

يحمل متغير البيئة GOPATH$ قائمةً تتضمن أماكن ليبحث فيها جو عن مساحات العمل.

يتوقع جو في الحالة الافتراضية أنّ موقع GOPATH الخاص بك هو HOME/go$، حيث HOME$ هو المجلد الجذر لحساب المستخدِم الخاص بك على الحاسب، ويمكنك تغيير ذلك من خلال تعديل متغير البيئة GOPATH$ حسب توثيق جو.

الفرق بين GOPATH$ و GOROOT$

يُعَدّ GOROOT$ المكان الذي تتواجد فيه شيفرة جو والمصرِّف compiler والأدوات الأخرى التابعة له، أي أنه لا يتضمن الشيفرة المصدرية الخاصة بك، وعادةً ما يكون مسار GOROOT$ هو usr/local/go/ ومسار GOPATH$ هو HOME/go$، كما تجدر الإشارة إلى أنك لست بحاجة إلى إعداد المتغير GOROOT$ بعد الآن، إذ كان ذلك مطلبًا في السابق.

مكونات مساحة العمل

توجد ثلاثة مجلدات داخل مساحة عمل جو أو GOPATH وهي bin و pkg و src، كما يملك كل مجلد من هذه المجلدات وظيفةً خاصةً في جو.

.
├── bin
├── pkg
└── src
  └── github.com/foo/bar
    └── bar.go

يمثّل المجلد GOPATH/bin$ المكان الذي توضع فيه الملفات الثنائية (التنفيذيّة) التي تم تثبيتها بواسطة الأمر go install.

يستخدِم نظام التشغيل متغير البيئة PATH$ للعثور على الملفات الثنائية التي يمكن تنفيذها بدون كتابة المسار الكامل، لذا يوصى بإضافة المجلد bin إلى المتغير PATH$ العام، فإذا لم تضف GOPATH/bin$ مثلًا إلى متغير البيئة PATH$، فسنحتاج إلى كتابة ما يلي:

$ $GOPATH/bin/myapp

أما إذا كان مُضافًا إليه لكان بالإمكان تشغيله بكتابة ما يلي:

$ myapp

توضع في المجلد GOPATH/pkg$ ملفات الكائنات المُصرّفة مسبقًا والتي تُستخدَم لتسريع عملية التصريف في وقت لاحق، ومن الجدير بالذكر أنّ معظم المطورين لن يحتاجوا إلى التعامل مع هذا المجلد، فإذا كنت تواجه مشكلات في التصريف، فيمكنك حذف هذا المجلد بأمان وسيُعيد جو بناءه.

توضع في المجلد src شيفرة جو المصدرية وهي الملفات التي يتم كتابتها وإنشاؤها باستخدام لغة جو والتي تكون لاحقتها ‎.go، الملفات المصدرية يستخدمها مُصرّف جو لإنشاء ملفات قابلة للتنفيذ (ملفات ثنائية يمكن تشغيلها على نظامك لتنفيذ المهام التي تتضمنها). وانتبه جيدًا مرةً أخرى إلى أنّ هذه الملفات ليست الملفات الموجودة في GOROOT$، كما ستوضع هذه الملفات في المسار GOPATH/src/path/to/code$ أثناء كتابة برامج وحزم ومكتبات جو.

ما هي الحزم؟

تُعَدّ الحزم طريقةً بسيطةً لتجزئة برنامجك إلى أجزاء أصغر مُقسّمة حسب الغرض أو الوظيفة، كما يُمكن الإشارة للحزم على أنها مكتبات libraries أو وحدات modules، تركيب الحزم مع بعضها يشكل مُجمل برنامجك. الشيفرات التي تُكتب في جو تُنظّم ضمن حزم، إذ تمثل الحزمة جميع الملفات الموجودة في مجلد واحد على القرص.

تتبع جو القواعد التالية في كيفية تقسيم برنامج إلى حزم:

  • تُخزّن الحزم مع جميع ملفات جو المصدرية المكتوبة من قبل المستخدِم ضمن المجلد GOPATH/src$.
  • الحزمة غالبًا عبارة عن مجلد داخل مشروعك به الملفات التي تحمل اسم الحزمة.
  • لابد من وجود حزمة واحدة على الأقل في أي برنامج أو مكتبة.
  • إذا كان البرنامج عبارة عن برنامج تنفيذي (وليس مكتبة - library) فإنه يجب وجود حزمة باسم main (أي package main) تكون هي مدخل البرنامج كما رأينا سابقًا.

وكتذكير لما ذكرناه سابقًا:

  • لابد لكل ملف شفرة برمجية في Go أن ينتمي إلى حزمة (package) ما.
  • لابد لكل حزمة في Go أن تنتمي إلى مجلد ما.
  • لا يمكن لحزمتين التواجد على مستوى نفس المجلد، لكن يمكن لعدة ملفات أن تنتمي إلى نفس الحزمة (يعني مجلد به عدة ملفات).
  • يمكن أن تتواجد حزمة داخل حزمة أخرى لكن كلٌ في مجلد فرعي على حِدى.
  • يمكن للمجلد الرئيسي لمشروعك أن يحتوي على حزمة ما، واحدة فقط، باقي الحزم الخاصة به يمكنها أن تتواجد في مجلدات فرعية.
  • غياب حزمة main من برنامج ما، يجعل منه مكتبة فقط وليس برنامجا تشغيليا قائما بحد ذاته.

إذا كانت الشيفرة الخاصة بك موجودةً في المسار GOPATH/src/blue/red$ فيجب أن يكون اسم الحزمة التي تنتمي إليها الشيفرة هو red، ويمكنك استيراد هذه الحزمة كما يلي:

import "blue/red"

في حالة الحزم المتواجدة ضمن مستودعات على مواقع استضافة الشيفرات مثل GitHub و BitBucket، فيجب تضمين المسار الكامل في عملية الاستيراد، فإذا أردنا استيراد الشيفرة المصدرية من الرابط https://github.com/gobuffalo/buffalo، فسنكتب ما يلي:

import "github.com/gobuffalo/buffalo"

وستُخزَّن في الموقع التالي على القرص:

$GOPATH/src/github.com/gobuffalo/buffalo

خاتمة

تعرّفت في هذه المقالة على المجلد GOPATH الذي يحتوي على مجموعة من المجلدات التي يتوقع جو وجود الشيفرة المصدرية الخاصة بك بداخلها، بالإضافة إلى ماهية تلك المجلدات وما تحتوي عليها، كما تعرّفت على كيفية تغيير الموقع الافتراضي HOME/go$ له، وتعرّفت على الآلية التي يبحث بها جو عن الحزم داخل بنية المجلد.

قُدّمت Go Modules في الإصدار 1.11 من جو، وتهدف إلى استبدال مساحات عمل جو و GOPATH، وعلى الرغم من أنه يُوصى ببدء استخدامها إلا أنّ بعض البيئات قد لا تكون جاهزةً لاستخدامها مثل بيئات الشركة corporate environments.

يُعَدّ GOPATH أكثر الجوانب تعقيدًا في إعداد جو ولكن بمجرد إعداده يمكنك نسيانه بعدها على الغالب.

ترجمة -وبتصرُّف- للمقال Understanding the GOPATH لصاحبه Gopher Guides.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...