نظرة عامة

هذا هو تخطيط أساسي لمشروعات تطبيقات Go. إنها ليست معياراً رسمياً محدداً من قبل فريق تطوير Go الأساسي; إنه تخطيط مستخدم بشكل شائع لمشاريع Go في المجتمع.

إذا كنت تتعلم Go أو تقوم ببناء دليل البرهان (PoC) أو مشروع شخصي بسيط، فإن تخطيط المشروع هذا معقد للغاية. بدلاً من ذلك، ابدأ بتخطيط بسيط حقاً (مجرد ملف main.go وملف go.mod كافي). على الرغم من تطور مشروعك، تأكد من أن بنية الكود جيدة، وإلا فستنتهي بالكثير من الرمز المرتبط بالتبعيات والحالة العامة المخفية. عندما يشارك المزيد من الأشخاص في المشروع، تحتاج إلى طريقة مُنظمة. في هذه الحالة، من المهم أن تُدخل طريقة شائعة لإدارة الحزم/المكتبات. عندما تكون لديك مشروع مفتوح المصدر أو تعلم أن مشاريعًا أخرى تقوم بتوريث الرمز من مستودع مشروعك، يصبح من الأهمية وجود حزم ورمز (تُعرف أيضًا باسم internal) خاصة. انسخ المستودع، احتفظ بالأجزاء التي تحتاجها، واحذف كل شيء آخر! لا يعني وجود شيء أنه يجب عليك استخدام كل شيء. لا يُستخدم أيٌ من هذه الأنماط في كل مشروع. حتى نمط vendor ليس شاملاً.

تم تصميم تخطيط هذا المشروع بشكل متعمد ليكون عامًا للغاية ولا يحاول فرض بنية محددة لحزمة Go.

مواصفات مجلد مشروع Go

أدناه توجيهات تخطيط المجلد الموصى بها لمشروع Go.

.
├── go.mod
├── api
├── assets
├── build
├── cmd
├── configs
├── deployments
├── docs
├── examples
├── githooks
├── go.mod
├── init
├── internal
├── pkg
├── scripts
├── test
├── third_party
├── tools
├── vendor
├── web
└── website

يتم تقديم معاني كل مجلد أدناه.

/cmd

التطبيقات الرئيسية للمشروع، أي نقطة الدخول للبرامج. يُنشئ ملفات Go في هذا المجلد عادةً ملفات قابلة للتنفيذ. في مشروع بسيط، يمكن لملف مثل /test/main.go أن يكون نقطة الدخول.

يجب أن يتطابق اسم المجلد مع اسم الملف القابل للتنفيذ الذي ترغب فيه (على سبيل المثال /cmd/myapp).

لا تضع الكثير من الرمز في مجلد التطبيق. إذا كنت تعتقد أن الرمز يمكن استيراده واستخدامه في مشاريع أخرى، ضعه في مجلد /pkg. إذا كان الرمز غير قابل لإعادة الاستخدام أو لا ترغب في أن يقوم آخرون باستخدامه، ضع الرمز في مجلد /internal. ستفاجأ من تصرفات الآخرين، لذا عبّر عن نيتك بوضوح!

عادةً ما يكون هناك دالة main صغيرة تقوم باستيراد واستدعاء الرمز من المجلدين /internal و/pkg، ولا شيء آخر.

/internal

رمز التطبيق الخاص والمكتبة. هذا هو الرمز الذي لا ترغب في استيراده من قبل الآخرين في تطبيقاتهم أو مكتباتهم. لاحظ أن نمط التخطيط هذا يفرضه المترجم المتكامل Go نفسه. لمزيد من المعلومات المفصلة، يُرجى الرجوع إلى ملاحظات الإصدار ل Go 1.4. لاحظ أنه ليس محصوراً في مجلد internal على مستوى أعلى. يمكنك وضع مجلدات internal متعددة في أي مستوى من شجرة المشروع.

قد تختار إضافة بعض الهيكل الإضافي لحزم الداخلية للتفريق بين الرمز الداخلي المشترك وغير المشترك. ليس مطلوباً هذا (خاصةً للمشاريع الصغيرة)، ولكن توضيح الرمز المقصود استخدامه بصرياً هو ممارسة جيدة. يمكن وضع رمز التطبيق الفعلي في مجلد /internal/app (على سبيل المثال /internal/app/myapp)، ويمكن وضع الرمز المشترك لهذه التطبيقات في مجلد /internal/pkg (على سبيل المثال /internal/pkg/myprivlib).

/pkg

رمز المكتبة الذي يمكن استخدامه من قبل تطبيقات خارجية (على سبيل المثال /pkg/mypubliclib). ستقوم مشاريع أخرى بإستيراد هذه المكتبات وتتوقع أن تعمل بشكل صحيح، لذا فكر جيداً قبل وضع المحتوى هنا :-) لاحظ أن مجلد internal هو طريقة أفضل للتأكد من عدم إمكانية استيراد الحزم الخاصة، حيث يُنفذ ذلك ذاتياً بواسطة Go. مع ذلك، مجلد /pkg لا يزال وسيلة جيدة للتعبير بشكل صريح عن أن الرمز في هذا المجلد آمن للاستخدام من قبل الآخرين.

إذا كان مشروع التطبيق الخاص بك صغيراً للغاية وكان التضمين المتعدد المستويات لا يضيف قيمة كبيرة، فإنه من المقبول أيضاً عدم استخدامه (ما لم تكن ترغب حقاً في استخدامه :-)). عندما يصبح المشروع كبيراً بما فيه الكفاية ويصبح المجلد الرئيسي مشغولاً للغاية، فكر في استخدامه (خاصةً إذا كان لديك العديد من مكونات التطبيق غير Go).

/vendor

تعتمد تطبيقات الوثيقة (سواء تم إدارتها يدويًا أو باستخدام أداة إدارة الاعتمادات المفضلة لديك ، مثل ميزة Go Modules المدمجة). سيقوم الأمر go mod vendor بإنشاء دليل /vendor لديك. يرجى ملاحظة أنه إذا لم تكن تستخدم إصدار Go 1.14 المفعل بشكل افتراضي ، فقد تحتاج إلى إضافة علم -mod=vendor إلى أمر go build.

إذا كنت تقوم ببناء مكتبة ، يرجى عدم تأكيد اعتمادات تطبيقك.

دلائل تطبيق الخدمة

/api

مواصفات OpenAPI/Swagger ، ملفات مخطط JSON ، ملفات تعريف البروتوكول ، ودلائل البروتوكول API.

دلائل تطبيق الويب

/web

مكونات محددة لتطبيقات الويب: أصول الموقع الثابتة لموقع الويب ، القوالب الخادمية ، وتطبيقات الصفحة الواحدة (SPAs).

دلائل تطبيق عامة

/configs

قوالب ملفات التكوين أو تكوينات افتراضية.

ضع ملفات النموذج confd أو consul-template هنا.

/init

تهيئة النظام (systemd ، upstart ، sysv) وتكوينات مدير العمليات/الخدمة (runit ، supervisord).

/scripts

نصوص لمختلف عمليات البناء والتثبيت والتحليل وغيرها من العمليات.

/build

التغليف والتكامل المستمر.

ضع تكوينات الحزمة السحابية (AMI) ، وحاوية (Docker) ، ونظام التشغيل (deb ، rpm ، pkg) ، والنصوص في الدليل /build/package.

ضع تكوينات ونصوص التكامل المستمر (travis ، circle ، drone) في الدليل /build/ci. يرجى ملاحظة أن أدوات التكامل المستمر (مثل Travis CI) تكون محددة للغاية فيما يتعلق بموقع ملفات التكوين الخاصة بها. حاول وضع ملفات التكوين في الدليل /build/ci واستخدام الروابط لربطها بالموقع المتوقع من أدوات التكامل المستمر (إذا كان ذلك ممكنًا).

/deployments

تكوينات النشر والقوالب لـ IaaS ، PaaS ، النظام ، وتنظيم الحاويات (docker-compose ، kubernetes/helm ، terraform). يرجى ملاحظة أنه في بعض مستودعات البيانات (خاصة بالتطبيقات المنشورة باستخدام Kubernetes) يُسمى هذا الدليل /deploy.

/test

تطبيقات اختبار خارجية وبيانات اختبار أخرى. لا تتردد في تنظيم الدليل /test بالطريقة التي تناسب احتياجاتك. بالنسبة للمشاريع الكبيرة ، يُعقل تنظيم البيانات في مجلدات فرعية. على سبيل المثال ، يمكنك إنشاء مجلدات /test/data أو /test/testdata داخل /test لجعل Go يتجاهل المحتويات. يرجى ملاحظة أن Go يتجاهل أيضًا المجلدات أو الملفات التي تبدأ بـ "." أو "_", مما يوفر مزيدًا من المرونة في تسمية مجلدات بيانات الاختبار.

دلائل أخرى

/docs

توثيق التصميم والمستخدم (بخلاف مستندات godoc التي تولدها).

/tools

أدوات الدعم لهذا المشروع. يرجى ملاحظة أن هذه الأدوات يمكنها استيراد الكود من الدلائل /pkg و /internal.

/examples

أمثلة عن التطبيقات و/أو المكتبات العامة.

/third_party

أدوات الدعم الخارجية والشفرة المطوية وأدوات الأطراف الثالث الأخرى (على سبيل المثال ، Swagger UI).

/githooks

هوكات الجيت.

/assets

الأصول الإضافية (الصور ، الشعارات ، الخ).

/website

موقع لتخزين بيانات موقع المشروع إذا كنت لا تستخدم صفحات GitHub.

/src

قد تحتوي مشروعات Go على مجلد src ، ولكن هذا يرجع عادةً إلى المطورين القادمين من عالم Java ، حيث يعتبر نمط شائع. إذا كان ذلك ممكنًا ، فحاول تجنب اعتماد هذا النمط المشابه للجافا. حقًا لا ترغب في أن يبدو كود Go الخاص بك أو مشروعك مثل الجافا :-)

لا تلتبس بين دليل /src على مستوى المشروع مع دليل /src المستخدم لمساحة العمل Go ، الموصوفة في كيفية كتابة كود Go. المتغير البيئي $GOPATH يشير إلى مساحة العمل (الحالية) الخاصة بك (افتراضيًا ، في الأنظمة غير ويندوز يشير إلى دليل $HOME/go). تتضمن هذه المساحة الأدلة العلوية /pkg ، /bin ، و /src. سيكون مشروعك الفعلي مجلدًا فرعيًا تحت دليل /src ، لذا إذا كان لمشروعك دليل /src ، فإن مسار المشروع سيبدو على النحو التالي: /some/path/to/workspace/src/your_project/src/your_code.go. يرجى ملاحظة أنه من إصدار Go 1.11 فصاعدًا ، يمكن تحديد مشروعك خارج GOPATH ، ولكن ذلك لا يعني أن استخدام نمط التخطيط هذا فكرة جيدة.