چند سالی هست که مفهوم monorepo تبدیل به یک مفهوم داغ و ترند در فضای توسعه نرم‌افزار، بویژه توسعه فرانت اند شده است. اشتراک کد بین سورس‌های فرانت اند یکی از دلایل محبوبیت monorepo است ولی این بدان معنی نیست که از monorepo برای کدهایی که به زبان های مختلف نوشته می‌شوند، استفاده نمی‌شود. در این نوشتار سعی می‌کنیم به بررسی این موضوع بپردازیم.


به شکل ساده میتوان monorepo را یک ریپوزیتوری تعریف کرد که سورس کد تمام پروژه‌های شما در آن قرار می‌گیرد. به این صورت که به جای ساخت یک ریپو برای هر پروژه – که به آن multirepo یا polyrepo نیز می گویند- ، تمام پروژه های شما در یک ریپو قرار میگیرند. بر این اساس ریپو شامل مجموعه ای از پروژه های منطقی است که میتوانند به هم مرتبط باشند یا نباشند. مثلا ممکن است در یک سناریو شما همه کدهای جاوا اسکریپت را در یک ریپو ذخیره یا کنید و یا انواع پروژه ها و با زبان های مختلف را یکجا نگهداری کنید. تصویر زیر این ساختار را توضیح میدهد.

تفاوت بین مونوریپو و مولتی ریپو
تفاوت بین مولتی ریپو و مونوریپو

مونوریپو میتواند از ابعاد مختلفی مانند تعدد کامیت ها و برنچ ها، تعداد فایل ها و سایز فایل های مدیریت شده به شدت رشد کند. اکثر سازمان های بزرگ بنا به دلایلی که در ادامه مطرح خواهد شد از مونوریپو به عنوان الگوی اصلی نگهداری سورس هایشان استفاده می‌کنند. به عنوان مثال در مونوریپو گوگل در سال ۲۰۱۵ بیش از ۸۰ ترابایت دیتا، ۲ میلیارد خط کد و ۹ میلیون فایل وجود داشته است. همچنین در یک مونوریپو فیسبوک ۴ میلیون کامیت، ۱.۳ میلیون فایل و حجم فولدر .git بیش از ۱۵ گیگابایت بوده است.

مونوریپو چه مزیت هایی دارد؟

  • اشتراک کد و همکاری بین برنامه نویسان. این شاید مهمترین دلیل استفاده از مونوریپو باشد و بر این اساس همه کاربران میتوانند به همه سورس ها دسترسی داشته باشند.
  • استفاده مجدد از کد یکی از بدیهی ترین ساختارهایی که در پروژه های نرم افزاری به شدت مهم است. در صورتی که ساختار سورس کد به گونه ای باشد که بتوان از کدها در جایگاه های مختلف استفاده کرد، مونوریپو بسیار سودمند خواهد بود. به عنوان مثال فرض کنید از React برای توسعه نسخه وب و React Native برای توسعه نسخه موبایل استفاده کرده باشید به راحتی میتوانید بیزنس و کدهای دسترسی داده را استفاده مجدد نمایید.
  • بیلد یکپارچه و مدیریت وابستگی ها. در مونوریپو و ابزارهایی همچون Bazel، Pants همه پروژه ها را یکجا بیلد کنید و وابستگی‌هایشان را مدیریت کنید. مفهوم ابزارهای بیلد مستقل از زبان در سال های اخیر و بواسطه رشد مونوریپو، حوزه جذابی برای DevOps ها بوده است.
  • مدیریت نسخه ها بويژه در سازمان هایی که بخشی از کار آنها توسعه کتابخانه است همیشه چالش انگیز است. با استفاده از مونوریپو مثلا میتوانید بر روی یک کامیت خاص همه نسخه ها را جلو برده و یا هرکدام مستقلا مدیریت کنید.
  • نقشه وابستگی. اگر همه سورس ها یکجا باشند و بین آنها وابستگی وجود داشته باشد به راحتی میتوان نقشه وابستگی را ترسیم و تغییرات بر روی هر یک از آنها را رصد و مدیریت کرد. در حالت مولتی ریپو در صورت تغییر در یک وابستگی تاثیر آن بر روی سایر پروژه ها به سختی قابل مدیریت است.

مونوریپو چه معایبی دارد؟

به تجربه من، مونوریپو در سازمان‌هایی که به دلایل مختلف لازم میبنند که برنامه نویس هر پروژه صرفا به سورس پروژه خود دسترسی داشته باشد، عملا قابل پیاده سازی نیست. در این سازمانها فرهنگ سازمانی ایجاب میکند دسترسی ها کنترل شود و سورس به شکل محافظت شده مدیریت شود.

وقتی سازمانی تصمیم میگیرد که همه سورس خود را در یک ریپو نگهداری کند قاعدتا بستر نگهداری کد بایستی مقیاس پذیر باشد تا درخواست زیاد بر روی سرور نگهداری کد را دچار اختلال نکند.

تکنولوژی باید به توسعه بیزنس و کسب و کار شما کمک کند نه اینکه بیزنس شما اسیر تکنولوژی شود. این گزاره برای سازمان هایی که وظیفه اصلی آنها توسعه بیزنس و کسب و کار است بسیار مهم است. برخی سازمان ها صرفا به دلایل جذابیت و ترند بودن یک تکنولوژی از آن استفاده میکنند و در بلند مدت دچار مشکلاتی می شوند. اگر واقعا به یک تکنولوژی نیاز دارید و راهکار حل مسایل شما میشود از آن استفاده کنید نه به دلیل اینکه استار و فورک بالایی در گیت هاب دارد.

چگونه مونوریپو ایجاد کنم؟

برای مدیریت مونوریپو به ويژه در جاوا اسکریپت، ابزارها و روش های مختلفی وجود دارد که در مقالات زیر به بررسی آن خواهیم پرداخت.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *