مستودع واحد مع Go: تنظيم الكود عملياً

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

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

ابدأ الدورة

مستودع واحد مع Go: تنظيم الكود عملياً



المستودع الواحد (monorepo) هو نهج لإدارة الكود يتم فيه تخزين جميع المشاريع والمكتبات والخدمات في مستودع واحد. في مجتمع Go، يكتسب هذا النهج شعبية بسبب بساطته وكفاءته. في هذه المقالة، سنشرح كيفية تنظيم مشروع Go في مستودع واحد عملياً: من اختيار الهيكل إلى إعداد CI/CD.



لماذا المستودع الواحد لـ Go؟



صُممت Go في الأصل لتكون لغة لقواعد الكود الكبيرة. أدوات مثل go mod و go work تجعل العمل مع المستودع الواحد طبيعياً. المزايا الرئيسية:



  • تبسيط التبعيات: تستخدم جميع الوحدات إصداراً واحداً من الحزم، ولا توجد تعارضات في الإصدارات.
  • CI/CD موحد: ملف تكوين واحد لجميع الخدمات، مما يسهل الصيانة.
  • إعادة الهيكلة: تغيير API في مكتبة ينعكس فوراً على جميع المستهلكين في المستودع.
  • معايير موحدة: يتم تطبيق أدوات التحليل (linters) والتنسيق (formatters) ومراجعة الكود على جميع الكود.


هيكل المستودع الواحد: مخطط مجرب



لننظر إلى هيكل يعمل بشكل ممتاز لمشاريع Go متوسطة الحجم. لنفترض أن لدينا خدمتين: auth-service و api-gateway، بالإضافة إلى مكتبات مشتركة.



my-project/├── apps/                    # التطبيقات القابلة للتنفيذ│   ├── auth-service/│   │   ├── cmd/│   │   │   └── main.go│   │   ├── internal/│   │   │   ├── handler/│   │   │   ├── service/│   │   │   └── repository/│   │   ├── go.mod│   │   └── go.sum│   └── api-gateway/│       ├── cmd/│       │   └── main.go│       ├── internal/│       │   ├── middleware/│       │   └── routes/│       ├── go.mod│       └── go.sum├── libs/                    # المكتبات المشتركة│   ├── config/│   │   ├── config.go│   │   ├── go.mod│   │   └── go.sum│   ├── logger/│   │   ├── logger.go│   │   ├── go.mod│   │   └── go.sum│   └── db/│       ├── postgres.go│       ├── go.mod│       └── go.sum├── scripts/                 # نصوص لـ CI/CD والأدوات المساعدة│   ├── build.sh│   └── test.sh├── go.work                  # مساحة عمل Go (اختياري)├── .golangci.yml            # إعدادات أداة التحليل (linter)├── Makefile                 # الأوامر المشتركة└── README.md


العناصر الأساسية للهيكل



  • apps/ — جميع التطبيقات القابلة للتنفيذ. لكل تطبيق نقطة دخول خاصة به (cmd/main.go) وملف go.mod خاص به.
  • libs/ — المكتبات ذات الاستخدام العام. كل مكتبة هي وحدة Go منفصلة.
  • scripts/ — نصوص مساعدة للبناء والاختبار والنشر.
  • go.work — ملف مساحة عمل Go، يبسط التطوير المحلي.


إعداد مساحة عمل Go للتطوير المحلي



يدعم Go 1.18+ مساحة العمل (Workspace) من خلال ملف go.work. يتيح ذلك الإشارة محلياً إلى المكتبات من libs/ دون نشرها في مستودع بعيد.



أنشئ go.work في جذر المشروع:



go 1.22

use ( ./apps/auth-service ./apps/api-gateway ./libs/config ./libs/logger ./libs/db)


الآن، أثناء التطوير، يمكنك استيراد المكتبات مباشرة:



// apps/auth-service/cmd/main.gopackage main

import ( "my-project/libs/config" "my-project/libs/logger")

func main() { cfg := config.Load() log := logger.New(cfg.LogLevel) log.Info("Auth service started")}


ملاحظة مهمة: في ملف go.mod لكل تطبيق، يجب أن يشير الاعتماد على المكتبة إلى المسار المحلي باستخدام replace:



// apps/auth-service/go.modmodule github.com/company/my-project/a                

المدونات

توصيات الكتب