সংক্ষিপ্ত বিবরণ

এটি একটি গো প্রোজেক্টের জন্য বেসিক লেআউট। এটি Go কোর ডেভেলপমেন্ট টিম দ্বারা অফিসিয়ালি সংরক্ষিত মান বিশ্বাস করা হয়নি; এটি সাধারণভাবে ব্যবহৃত হচ্ছে কমিউনিটি Go প্রজেক্টের জন্য

যদি আপনি Go শিখছেন বা কোনও প্রুফ অব কনসেপ্ট (PoC) বা একটি সাধারণ ব্যক্তিগত প্রজেক্ট তৈরি করছেন, তাহলে এই প্রজেক্ট লেআউট খুব জটিল। আসলে, এটি শুধুমাত্র main.go ফাইল এবং go.mod দিয়ে একটি সত্যিকার সাধারণ লেআউট দিয়ে শুরু করা উচিত। যখন আপনার প্রজেক্ট বিকাশ করতে থাকবে, আপনার কোড স্ট্রাকচারটি ভাল থাকার নিশ্চয়তা করুন, অন্যথায় আপনি গোলাপি কোডের সঙ্গে হিডেন ডিপেন্ডেন্সি এবং গ্লোবাল স্টেটসের সাথে শেখাবেন। যখন কিছু নতুন লোক প্রজেক্টে ইনভলভ করবেন, তখন একটি ভাল স্ট্রাকচারের জন্য এভান্টশ্হ হবে। এই ক্ষেত্রে, প্যাকেজ/লাইব্রেরি গুলি পরিচালনার সাধারন একটি উপায় বিস্তারিতভাবে পরিচিত কার্যকান্ডের জন্য গুরুত্বপূর্ণ। যখন আপনার একটি ওপেন-সোর্স প্রজেক্ট আছে বা আপনি জানেন আরো প্রজেক্ট আপনার প্রজেক্ট রেপো’ তেনি কোড ইমপোর্ট করে, প্রাইভেট ( অথবা আরো করা হয়) প্যাকেজ এবং কোড গুলি গুরুত্বপূর্ণ হয়। রেপো ক্লোন করুন, আপনি যা দরকার, তাওছেনো এবং অথেবা সব আরো বিলুপ করুন! তা ইউজ করতে হব෬ ইট আছে তা মানেন না। এই প্যাটার্নগুলির কোনোটা সব প্রজেক্টে ব্যবহৃত হয় না। বেবডরও এর প্যাটার্ন ইউনিভাক্সাল না।

এই প্রজেক্ট লেআউট উপোন্ত খুব সাধারণ ভাবে ডিজাইন করা হয়েছে এবং সাধারণভাবে গো প্যাকেজ ষ্ট্রাকচার নির্ধারণরূপ করতে চেষ্টা করে না।

গো প্রোজেক্ট ডাইরেক্টরি স্পেসিফিকেশন

নিচে প্রস্তাবিত হল গো প্রজেক্ট ডাইরেক্টরি নির্ধারণ।

.
├── 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

প্রজেক্টের মূল অ্যাপ্লিকেশন, অর্থাৎ, প্রোগ্রামের এন্ট্রি পুয়িন্ট। এই ডাইরেক্টরিতে গো ফাইলগুলি সাধারণভাবে সাদা করে তৈরি করা executable ফাইলগুলি উদ্ভব করে। একটি সাধারণ প্রজেক্টে, যে কোন ফাইল যেমন /test/main.go অ্যাপ্লিকেশনের এন্ট্রি পয়েন্ট হিসাবে কাজ করতে পারে।

প্রতিটি অ্যাপ্লিকেশন ডাইরেক্টরির নামো হিসাবে একাডেমিক ফাইলটির নাম রাখতে হবে (উদাহরণস্বরূপ, /cmd/myapp)। এ্যাপ্লিকেশন ডাইরেক্টরিতে খুব বেশি কোড রাখা উচিত না। যদি আপনি মনে করেন যে কোডটি ইমপোর্ট এবং অন্য প্রজেক্টগুলিতে ব্যবহার করা যাবে তাহলে এটি /pkg ডাইরেক্টরিতে রাখুন। যদি কোডটি পুনর্ব্যবহারযোগ্য না হয় অথবা আপনি চান না অন্যরা এটি পুনর্ব্যবহার করে, তাহলে কোডটি /internal ডাইরেক্টরিতে রাখুন। আপনি অন্য লোকেরা আপনার ইনটেন্টটি বুঝলে অবাক হবেন, সেই জন্য আপনার ইনটেন্টটো স্পষ্টভাবে প্রকাশ করুন!

প্রস্তাবিতভাবে, আমাদের /internal এবং /pkg

/vendor

অ্যাপ্লিকেশনের নির্ভরতা (ম্যানুয়ালি পরিচালিত অথবা আপনার পছন্দনীয় নির্ভরতা ব্যবহার করে হোলো - যেমনঃ অংতর্নিহিত Go Modules বৈশিষ্ট্য)। go mod vendor কমান্ডটি আপনি জন্য /vendor নির্দেশিকাটি তৈরি করবে। দয়া করে মনে রাখবেন, যদি আপনি ডিফল্ট সক্রিয় না Go 1.14 সংস্করণ ব্যবহার করছেন, তাহলে go build কমান্ডে -mod=vendor ফ্ল্যাগ যোগ করতে পারেন।

যদি আপনি লাইব্রেরি তৈরি করছেন, তাহলে আপনার অ্যাপ্লিকেশনের নির্ভরতা কমিট করবেন না।

সার্ভিস অ্যাপ্লিকেশন নির্দেশিকা

/api

OpenAPI/Swagger স্পেসিফিকেশন, JSON স্কিমা ফাইল, প্রোটোকল নির্ধারণ ফাইল এবং API প্রোটোকল নির্দেশিত নির্দেশিকা।

ওয়েব অ্যাপ্লিকেশন নির্দেশিকা

/web

ওয়েব অ্যাপ্লিকেশনের জন্য বিশেষ উপাদান: স্ট্যাটিক ওয়েবসাইট সম্পদ, সার্ভার-সাইড টেমপ্লেট, এবং সিঙ্গেল-পেজ অ্যাপ্লিকেশন (SPAs)।

সাধারণ অ্যাপ্লিকেশন নির্দেশিকা

/configs

কনফিগারেশন ফাইল টেমপ্লেট বা ডিফল্ট কনফিগারেশন।

আপনার confd বা consul-template টেমপ্লেট ফাইলগুলি এখানে রাখুন।

/init

সিস্টেম আরম্ভিকরণ (systemd, upstart, sysv) এবং প্রসেস ম্যানেজার/ডেমন (runit, supervisord) কনফিগারেশন।

/scripts

বিভিন্ন তৈরি, ইনস্টলেশন, বিশ্লেষণ, এবং অন্যান্য অপারেশনের জন্য স্ক্রিপ্ট।

/build

প্যাকেজিং এবং ধারাবাহিক সংহতি।

/build/package নির্দেশিত নির্দেশিকায় মেঘ (AMI), কন্টেনার (Docker), অপারেটিং সিস্টেম (deb, rpm, pkg) প্যাকেজ কনফিগারেশন এবং স্ক্রিপ্টগুলি রাখুন।

/build/ci নির্দেশিত নির্দেশিকায় ধারাবাহিক সংহতি (travis, circle, drone) কনফিগারেশন এবং স্ক্রিপ্ট রাখুন। দয়া করে মনে রাখবেন, নিরাপত্তা সংহতি সরল পরিণতি সাধন (উদাঃ Travis CI) এর স্থান সম্পর্কে অনেকটা বিরল, সম্ভবত নিরাপত্তা সরলগুলির কনফিগারেশন ফাইলগুলি নির্দেশিকা /build/ci তে অবস্থিত করার চেষ্টা করুন এবং সেগুলি সংহতি সরলগুলির মতো আমারা আশা করি (হ্যাঁ, সম্ভব হলে) তাদের প্রত্যাশিত স্থানে সংযুক্ত করার জন্য লিঙ্ক ব্যবহার করতে।

/deployments

IaaS, PaaS, সিস্টেম, এবং কন্টেনার অর্কেস্ট্রেশন (docker-compose, kubernetes/helm, terraform) ডিপ্লয়মেন্ট কনফিগারেশন এবং টেমপ্লেট। দয়া করে মনে রাখবেন, কিছু রিপোজিটরি (বিশেষতঃ Kubernetes ব্যবহার করে ডিপ্লয় করা অ্যাপ্লিকেশনের জন্য) এই নির্দেশিকাটি /deploy বলা হয়।

/test

অন্যান্য বহিরাগত পরীক্ষা অ্যাপ্লিকেশন এবং পরীক্ষা উপাত্ত। আপনার প্রয়োজনীয়তা অনুসারে /test নির্দেশিকাটি সাজাতে মুক্তি পান। বড় প্রকল্পের জন্য, তথ্যগুলি উপনিবেশে অনুযায়ী বিভক্ত করা একটি সুযোগ পায়। উদাহরণস্বরূপ, আপনি /test/data বা /test/testdata নির্দেশিত নির্দেশিকা তৈরি করতে পারেন, যাতে Go তার সামগ্রীগুলি উপেক্ষা করে। দয়া করে মনে রাখবেন, Go আরও এমনকি উদাহরণস্বরূপ "." বা "_" দিয়ে শুরু হওয়া নির্দেশিকা বা ফাইলগুলির ক্ষেত্রে আরও বড় নামকরণ প্রদান করে, পরীক্ষা উপাত্ত নির্দেশিকা নামকরণ সম্পর্কে বৃহত্তর সহজতা সরবরাহ করে।

অন্যান্য নির্দেশিকা

/docs

নথি এবং ব্যবহারকারী নথিগুলি (আপনি তৈরি করা godoc নথিগুলির বাইরে)।

/tools

এই প্রকল্পের সমর্থনীয় সরঞ্জাম। দয়া করে মনে রাখবেন, এই সরঞ্জামগুলি /pkg এবং /internal নির্দেশিত নির্দেশিকা থেকে কোড আমদানি করতে পারে।

/examples

অ্যাপ্লিকেশন এবং/অথবা পাবলিক লাইব্রেরির উদাহরণ।

/third_party

বাহ্যিক সহায়ক সরঞ্জাম, ফর্ক কোড, এবং অন্যান্য তৃতীয়পক্ষ সরঞ্জাম সরঞ্জামগুলি (উদাঃ স্বাগার UI)।

/githooks

গিট হুক।

/assets

সাম্প্রদায়িক (চিত্র, লোগো ইত্যাদি) সম্পদসমূহ রিপসিটরির সাথে প্রদত্ত।

/website

প্রকল্পের ওয়েবসাইটের তথ্য সংরক্ষণের জন্য স্থান, যদি আপনি GitHub পেজগুলি ব্যবহার করছেন না।

/src

কিছু Go প্রকল্পে একটি src ফোল্ডার থাকে, তবে এটি প্রায় প্রযাত্ন বিশেষত হয় জাভা বিশ্ব থেকে ডেভেলপারদের আসা এর জন্য। সম্ভব হলে, এই জাভা-মত প্যাটার্ন অনুসরণ করার চেষ্টা করুন না। আপনি বাস্তবে চাইতেন না যে আপনার Go কোড বা প্রকল্পটি জাভার মত দেখাবে :-)।

প্রকল্প-স্তরের /src নির্দেশিত নির্দেশিকার /src নির্দেশিত নির্দেশিকার সাথে ভুলে না দেয়। আপনার (বরতমান) ওয়ার্কস্পেসটি (ডিফল্টভাবে, নন-উইন্ডোজ সিস্টেমে - উইন্ডোজ সিস্টেমে প্রতিবেদনে, এটি ডিফল্টভাবে, $HOME/go নির্দিষ্ট করে) পুরোবরতি /pkg, /bin, এবং /src নির্দেশিত নির্দেশিকা অন্তর্ভুক্ত হয়। আপনার বাস্তবিক প্রকল্পটি হবে একটি /src নির্দেশিত নির্দেশিকার উপনির্দেশনী হবে, তাই যদি আপনার প্রকল্পে /src নির্দেশিত নির্দেশিকা থাকে, তাহলে প্রকল