Компания-разработчик программного обеспечения, такая как Google, поддерживает много кода. Как, серьезно, много. Например, более 2 миллиардов строк кода и 100 терабайт данных.

Это масштаб, который трудно даже понять, как все звезды во вселенной или все вселенные в мультивселенной. И у вас есть тысячи инженеров по всему миру, работающих над этим одновременно. Но поймите — они хранят весь свой код в едином монолитном репозитории и делают это с самого начала. Сегодня монорепозиторий Google, вероятно, является самой большой базой кода в мире, но для масштабирования требуются экстраординарные усилия. У них есть собственная собственная система контроля версий и высокотехнологичный инструмент сборки под названием Bazel, который носит гораздо более крутое имя Blaze внутри.

Здесь, в этой статье, мы узнаем все, что когда-либо хотели знать о монорепозиториях и о том, как скромный разработчик JavaScript может создать высокопроизводительное монорепозиторий в своем гараже. Итак, давайте погрузимся!

Возможно, вы слышали захватывающую новость о том, что Верчелли приобрел компанию под названием Turbo Repo. Это инструмент сборки, написанный на go, который позволяет очень легко управлять несколькими приложениями и пакетами в одном репозитории git.

Но сначала давайте ответим на вопрос, зачем мне использовать монорепозиторий. Есть много причин, но на самом высоком уровне это дает вам представление о всей кодовой базе вашей компании. Это без необходимости отслеживать и клонировать кучу разных репозиториев.

Кроме того, он обеспечивает согласованность, поскольку вы можете делиться такими вещами, как ваш eslint, настраивать библиотеку веб-компонентов для ваших библиотек утилит дизайна, документации и т. д.

Однако реальная сила приходит в форме управления зависимостями. Представьте, что кто-то вносит критическое изменение в разделяемую библиотеку. Все затронутые приложения узнают об этом мгновенно, а инструменты монорепозитория действительно могут помочь вам визуализировать весь граф зависимостей вашего программного обеспечения. Когда дело доходит до третьей стороны, монорепозиторий может дедупликации пакетов, которые используются в нескольких приложениях.

Монорепозиторий также идеально подходит для непрерывной интеграции и автоматизации, поскольку ваш код уже унифицирован по умолчанию, что значительно упрощает сборку и тестирование всего вместе.

Но есть одна большая проблема с монорепозиториями, и это тот факт, что они большие. По мере того, как монорепозиторий становится больше, появляется больше вещей, которые нужно тестировать, больше вещей, которые нужно создавать, и гораздо больше артефактов, которые нужно хранить.

В результате vs code будет отставать, пытаясь обработать массивную историю git, и вам потребуется 20-минутный перерыв на перекур, ожидающий, пока все запустится на сервере ci после каждого коммита, чтобы работать с монорепозиторием в масштабе. Крайне важно иметь правильный инструмент. Вот почему Facebook создал Buck, Microsoft создал Rush, а Google создал Bazel. Вам просто нужна докторская степень, чтобы использовать его.

К счастью, есть и другие варианты. Самый простой подход — использовать менеджер пакетов, такой как yarn или npm, для определения рабочих областей. Эти инструменты в основном настраивают ваш проект с пакетом корневого уровня JSON, который имеет вложенные рабочие места, такие как приложения и пакеты, которые связаны с проектом корневого уровня.

Крутая вещь в этом заключается в том, что он будет дедуплицировать ваши модули узла, что означает, что если у вас установлен один и тот же пакет в нескольких приложениях; он будет установлен только один раз. Это также позволяет вам организовывать сценарии.

Например, если вы хотите создавать или тестировать все свои приложения одновременно, это хорошее и простое место для начала. Но если вы создаете проект с открытым исходным кодом, который публикует кучу разных пакетов, то вам, вероятно, захочется изучить инструмент под названием Lerna. Lerna — это инструмент, который может оптимизировать рабочий процесс репозитория с несколькими пакетами. Вот пример.

Turf js — это геопространственная библиотека с множеством различных пакетов, которые по сути являются вспомогательными функциями для работы с данными геолокации. Каждый из них может быть установлен как отдельный пакет и находится в своем собственном подкаталоге здесь, в репозитории.

Lerna — это инструмент, который помогает эффективно управлять этим рабочим процессом. Самое главное, он позволяет публиковать все ваши пакеты в nom с помощью одной команды.

Эти инструменты отлично подходят для настройки монорепозиториев, но они по-прежнему страдают от той же проблемы, упомянутой ранее в статье. Инструменты становятся очень медленными и трудными для работы по мере того, как монорепы становятся больше.

Одной из проблем является установка зависимостей. Если вы хотите повысить скорость установки, простая оптимизация — замена npm на pnpm. Это вставная замена, которая установит ваши зависимости глобально и свяжет их с помощью сим-линка. Это может увеличить скорость установки до трех раз.

Это хорошее обновление, но что действительно делает монорепозиторий медленным, так это постоянная необходимость перекомпилировать, перестроить и повторно протестировать все.

Здесь становится важным обсудить совершенно другой класс инструментов, которые могут заставить ваше монорепозиторий работать со скоростью Google.

Здесь сравниваются инструменты NX и Turbo Repo. Оба они работают как интеллектуальная система сборки. Это означает, что они создают дерево зависимостей между всеми вашими приложениями и пакетами, что позволяет инструментам понять, что нужно протестировать, а что нужно перестроить.

Когда в кодовую базу вносятся изменения, они кэшируют любые файлы или артефакты, которые уже были созданы, а также могут запускать задания параллельно, чтобы выполнять все намного быстрее.

Давайте рассмотрим разницу между NX и Turbo Repo. NX существует около пяти лет и был создан двумя бывшими сотрудниками Google. Turbo Repo, с другой стороны, был просто открытым исходным кодом в тот день, когда его создал Джаред Палмер, которого вы, возможно, знаете по экосистеме React.

С такими пакетами, как Formic, на данный момент Turbo Repo намного более минимален, чем NX. Но NX может делать все, что делает Turbo Repo, и имеет дополнительные функции, такие как Oli, который может автоматически генерировать код Boilerplate для вас.