මොනො-රිපෝ (Monorepos): මොකක්ද මේ අලුත් කතාව?

Mic
By Mic

මෘදුකාංග හදන අයට “Repo” කියන වචනය අමුතු දෙයක් නෙවෙයිනේ. සාමාන්‍යයෙන් අපි පුරුදු වෙලා ඉන්නේ එක project එකකට එක Repo එකක් පාවිච්චි කරන්න. මේකට කියන්නේ Polyrepo ක්‍රමය කියලා. හැබැයි ඔයාලා දන්නවද Google, Meta, Microsoft වගේ ලෝකේ ලොකුම සමාගම් දැන් වැඩ කරන්නේ මීට වඩා ගොඩක් වෙනස් විදිහකට කියලා? අන්න ඒ අලුත් (ඇත්තටම දැන් ටිකක් පරණයි) විප්ලවයට තමයි මේ Monorepo කියලා කියන්නේ!

අද අපි බලමු මොකක්ද මේ Monorepo එකක් කියන්නේ, මේක ඇතුළේ වැඩ කරන්නේ කොහොමද සහ මේකෙන් අපිට ලැබෙන වාසි වගේම “පොඩි පොඩි අවුල්” මොනවාද කියලා.

මොකක්ද මේ Monorepo එකක් කියන්නේ?1

සරලවම කිව්වොත්, Monorepo එකක් කියන්නේ ඔයාගේ මුළු “Project” එකම එකම තැනක (එකම Git Repo එකක් ඇතුළේ) තබා ගැනීමයි. මේ Project එක ඇතුළේ අපිට Apps සහ Packages කිහිපයක් තියෙන්න පුළුවන්. ඔන්න හිතන්නකෝ ඔයාගේ ළඟ වෙබ් අඩවියක් (Frontend App), ඇප් එකක් (Mobile App) සහ ඒවට ඕන කරන Backend App එක තියෙනවා කියලා. සාමාන්‍ය විදිහට නම් මේවට Repo තුනක් ඕනේ. ඒත් Monorepo එකකදී මේ Apps තුනම දාන්නේ එකම Repo එකක් ඇතුළටයි! ඒ විතරක් නෙවෙයි, මේ හැම එකකටම පොදු දේවල් (උදාහරණයක් විදිහට business logic, images, TypeScript types) තියෙනවා නම්, ඒවා “Packages” විදිහට හදලා හැම App එකකටම පාවිච්චි කරන්න පුළුවන්.

මෙහෙම එකම තැනක ඔක්කොම තියෙන එකෙන් development process එක හිතාගන්න බැරි තරම් වේගවත් වෙනවා. මොකද හැම කෑල්ලක්ම එකිනෙකට සම්බන්ධ වෙලා තියෙන විදිහ ඕනෑම කෙනෙකුට එක බැලුමකින් බලාගන්න පුළුවන් නිසයි.

මේකෙන් අපිට ලැබෙන වාසි මොනවාද?

  1. Code බෙදාගන්න හරිම ලේසියි (Easy Code Sharing): Frontend එකටයි Backend එකටයි දෙකටම එක වගේ ඕන වෙන code කෑලි තියෙනවා නම් (උදා: Validation rules හෝ Types), ඒවා වෙනම libraries විදිහට NPM වලට publish කර කර ඉන්න ඕනේ නැහැ. එකම තැන තියෙන නිසා හරිම ලේසියෙන් දෙපැත්තටම share කරගන්න පුළුවන්. මේකෙන් “npm link” වගේ කරදරකාරී වැඩ වලින් ඔයාව බේරගන්නවා!
  2. වැඩේ එක පාරින් ඉවරයි (Atomic Commits): Backend එකේ API එකක පොඩි වෙනසක් කළා කියමු. ඒ වෙනස නිසා Frontend එකත් update කරන්න වෙනවා නම්, ඔයාට පුළුවන් ඒ දෙකම එකම වෙලාවේ වෙනස් කරලා එකම Commit එකක් විදිහට save කරන්න. එතකොට පද්ධති දෙක අතර “වර්ෂන් ගැලපෙන්නේ නැති” ප්‍රශ්න (Incompatibility issues) ඇතිවෙන්න තියෙන ඉඩ හරිම අඩුයි! මේකට තමයි Atomic Change එකක් කියන්නේ—එක වැඩක් නිසා මුළු system එකම එකවර update වීම.
  3. අලුත් අයට වැඩේ ලේසියි (Onboarding): කණ්ඩායමට අලුතින් කෙනෙක් එකතු වුණාම, එයාට තියෙන්නේ එකම එක Repo එකක් download (clone) කරගන්න විතරයි. “Clone, Install, Run” – එච්චරයි! මුළු පද්ධතියම වැඩ කරන්නේ කොහොමද කියලා එකම තැනකින් බලාගන්න ලැබෙන එක අලුත් අයට ලොකු පහසුවක්. ඔවුන්ට අවශ්‍ය documentation පවා එකම තැනකින් හොයාගන්න පුළුවන්.
  4. එකම නීති රීති පද්ධතියක් (Unified Standards): Code එක ලියන විදිහ (Linting), test කරන විදිහ සහ code format කරන විදිහ මුළු පද්ධතියටම එකම විදිහකට පවත්වාගෙන යන්න පුළුවන්. මුළු team එකම එකම “Standard” එකකට වැඩ කරනවා කියලා මේකෙන් සහතික වෙනවා. මේකෙන් code reviews වලදී වෙන අනවශ්‍ය වාද විවාදත් ගොඩක් අඩු වෙනවා.

Monorepos සහ Git Submodules: හොඳම දෙකේ එකතුවක්?

Monorepo එකක තියෙන ලොකුම අභියෝගයක් තමයි Access Control. ඒ කියන්නේ Repo එකට access තියෙන කෙනෙකුට හැම project එකක්ම පේන එක. හැබැයි අපිට මේකට Git Submodules පාවිච්චි කරන්න පුළුවන්!

ඔයාට පුළුවන් ඔයාගේ ප්‍රධාන Monorepo එක ඇතුළේ තවත් වෙනම Repo එකක් “embed” කරන්න. මේකට තමයි Git Submodule එකක් කියන්නේ.

  • ඇයි මේක වැදගත්? හිතන්න ඔයාගේ පද්ධතියේ එක project එකක් හරිම රහසිගතයි කියලා. ඒක වෙනම Repo එකක් විදිහට තියලා, ඕනෑම අයට විතරක් ඒකට access දීලා, ප්‍රධාන Monorepo එකට ඒක Submodule එකක් විදිහට ඇතුළත් කරන්න පුළුවන්.
  • වෙනම පාලනය (Separate Control): Submodules පාවිච්චි කරද්දී, ප්‍රධාන Repo එකේ version එකට බලපෑමක් නොවී අදාළ project එක විතරක් වෙනම update කරන්න හෝ වෙනම පාලනය කරන්න අවස්ථාව ලැබෙනවා. මේක නියම “Hybrid” (දෙමුහුන්) ක්‍රමයක්!

හැබැයි පොඩි පොඩි අභියෝග ටිකකුත් තියෙනවා!

  1. Repo එක ගොඩක් ලොකු වෙන්න පුළුවන්: Project සෑහෙන ගොඩක් එකම තැන තියෙද්දී Repo එකේ size එක ගොඩක් වැඩි වෙනවා. කාලයක් යද්දී git status වගේ commands පවා ටිකක් හිර වෙන්න පුළුවන්. ලොකුම අවුල වෙන්නේ මුල්ම වතාවට clone කරද්දී සෑහෙන වෙලාවක් යන එකයි.
  2. Build Time එක වැඩි වීම: ඔයා එක පොඩි folder එකක වෙනසක් කළත්, මුළු පද්ධතියම ආයෙත් build කරලා test කරන්න වුණොත් සෑහෙන කාලයක් යනවා. ඒ නිසා මේ වැඩේට සාමාන්‍ය Git විතරක් මදි. Nx හෝ Turborepo වගේ “Task Caching” සහ “Incremental builds” කරන්න පුළුවන් දියුණු tools පාවිච්චි කරන්නම ඕනේ! මේ tools මගින් කලින් build කරපු දේවල් මතක තියාගෙන (cache), වෙනස් වෙච්ච දේ විතරක් build කරන්න දන්නවා.

මේකට උදව් වෙන Tools මොනවාද?

දැන් කාලේ Monorepo එකක් හරිම ලේසියෙන් කරගෙන යන්න මේ වගේ tools පාවිච්චි කරන්න පුළුවන්:

  • Nx: දැනට තියෙන දියුණුම tool එකක්. ගොඩක් දේවල් automate කරන්න පුළුවන්.
  • Turborepo: Vercel සමාගමෙන් හදපු හරිම වේගවත් tool එකක්. ගොඩක් වෙලාවට Next.js පාවිච්චි කරන අයට මේක සුදුසුයි.
  • PNPM / Yarn Workspaces: ඔයාට ලොකු tools ඕනේ නැත්නම්, හරිම සරල මට්ටමේ Monorepo එකක් කරගෙන යන්න මේවා හොඳටම ඇති. පාවිච්චි කරන්න හරිම පහසුයි.

ඉතින් මොකද හිතන්නේ?

Monorepo කියන්නේ හැමෝටම ගැළපෙන “මැජික්” එකක් නෙවෙයි. ඔයා තනිවම කරන පුංචි project එකකට මේක ලොකු කරදරයක් වෙන්න පුළුවන්. හැබැයි ඔයාගේ team එක ලොකු වෙනවා නම්, project කිහිපයක් එකිනෙකට තදින් සම්බන්ධ වෙනවා නම් සහ ඔයාට වේගයෙන් වැඩ කරන්න ඕනේ නම්, Monorepo ක්‍රමය ඔයාගේ ජීවිතේ හරිම ලේසි කරයි! විශේෂයෙන්ම Submodules එක්ක පාවිච්චි කරද්දී තියෙන නම්‍යශීලී බව අතිවිශාලයි.


ඔයාගේ ඊළඟ project එක පටන් ගන්න කලින්, Monorepo එකක් ගැනත් පොඩ්ඩක් හිතලා බලන්න!

උපුටා ගැනීම : Nelaka Withanage

Share This Article