Monorepo के बारे में सब कुछ
(monorepo.tools)Monorepo क्या है
- "कई अलग-अलग प्रोजेक्ट्स को, स्पष्ट रूप से परिभाषित संबंधों के माध्यम से, एक ही Repo में रखना"
- Monorepo ≠ Monolith
यह क्यों करना चाहिए?
- मौजूदा Polyrepo (कई Repo इस्तेमाल करने का तरीका) चुनने का कारण "टीम स्वायत्तता (team autonomy)" था
- टीमें अपनी पसंद की लाइब्रेरी चुन सकती थीं, और यह तय कर सकती थीं कि कोड में कौन योगदान देगा और कौन उसका उपयोग करेगा
- PolyRepo में
- कोड शेयर करना झंझटभरा होता है
- कोड डुप्लिकेशन बहुत होता है
- shared libraries में critical bugs या बड़े बदलाव आने पर लागत बहुत बढ़ जाती है
- हर प्रोजेक्ट में development tools का इस्तेमाल एक जैसा नहीं होता
- Monorepo में
- नया प्रोजेक्ट बनाने का overhead नहीं होता
- पूरे प्रोजेक्ट में atomic commits संभव होते हैं
- सब कुछ एक ही version number से मैनेज किया जाता है
- developer mobility (प्रोजेक्ट्स के बीच स्थानांतरण) आसान होती है
Monorepo tools द्वारा दी जाने वाली सुविधाएँ और अलग-अलग tools की तुलना
→ Bazel, Gradle, Lage, Lerna, Nx, Rush, Turborepo
- local caching
- local task orchestration
- distributed caching
- distributed task execution
- transparent remote execution
- प्रभावित projects/packages का पता लगाना
- workspace analysis
- dependency graph visualization
- code sharing
- consistent tooling
- code generation
- project constraints और visibility
सोच में बदलाव
Monorepo आपके "संगठन और कोड के बारे में सोचने के तरीके" को बदल देता है
- यह consistency जोड़ता है,
- नए प्रोजेक्ट बनाते समय या बड़े पैमाने पर refactoring करते समय friction कम करता है,
- code sharing और teams के बीच collaboration को बढ़ावा देता है,
- जिससे संगठन अधिक कुशलता से काम कर सकता है
कई तरह के solutions हैं, लेकिन सबके लक्ष्य अलग हैं
- Bazel (by Google) : “A fast, scalable, multi-language and extensible build system.”
- Gradle (by Gradle, Inc) : “A fast, flexible polyglot build system designed for multi-project builds.”
- Lage (by Microsoft) : “Task runner in JS monorepos”
- Lerna : “A tool for managing JavaScript projects with multiple packages.”
- Nx (by Nrwl) : “Next generation build system with first class monorepo support and powerful integrations.”
- Rush (by Microsoft) : “Geared for large monorepos with lots of teams and projects. Part of the Rush Stack family of projects.”
- Turborepo (by Vercel) : “The high-performance build system for JavaScript & TypeScript codebases.”
4 टिप्पणियां
जब आप application डेवलप करके हर ग्राहक कंपनी में install करते हैं,
तो कुछ ग्राहक कंपनी ऐसे भी होते हैं जो अब upgrade नहीं चाहते,
और कुछ ग्राहक कंपनी अपने लिए एक खास version भी मांगते हैं.
इसलिए जैसे-जैसे ऐसे ग्राहक बढ़ते जाते हैं,
आखिरकार repository दर्जनों ग्राहक-विशेष version branches से भर जाती है.
हर branch में थोड़ा-थोड़ा अलग version होता है.
ऐसी स्थिति में Monorepo पर लिखा लेख देखता हूँ तो.. यह सचमुच किसी सपने जैसी बात लगती है. हा हा
मुझे याद आता है कि Torvalds ने कहा था कि ज़्यादातर स्थितियों में shared libraries अच्छा विचार नहीं हैं.. मैं हाल ही में इसे लागू करके देख रहा हूँ, लेकिन उम्मीद से कम हिस्से ही साझा करने लायक हैं और build system के उलझने वाले हिस्से बड़े हैं, इसलिए मुझे लगता है कि monorepo उतना आदर्श system नहीं है जितनी उससे उम्मीद की जाती है..
जब subversion का दौर हावी था, तब यह बस इतना स्वाभाविक था, इसलिए अब यह कुछ विडंबनापूर्ण लगता है।
मुझे यह भी अजीब लगता है कि चर्चा सिर्फ frontend development तक सीमित होकर रह जाती है।
ms ने git को भी subversion की तरह इस्तेमाल किया जा सके, इसके लिए virtual file system बनाया था, लेकिन उसका आम तौर पर प्रचलित न हो पाना दुखद है।
लगता है आजकल टेक फिर से घूम-फिरकर वहीं आ रहा है, और यह एहसास पहले से ज़्यादा हो गया है।
कभी-कभी सोचता हूँ, अरे यह वही चीज़ नहीं है जो पहले खास अच्छी नहीं थी? ...लगता है शायद बहुत लंबे समय से इस चक्कर में हूँ। हुहू