Когда проект запускается, мы создаем новый репозиторий исходного кода в VSTS / Github / bitbucket и начинаем добавлять в него весь код. каждый раз, когда мы добавляем новый модуль / повторно используемые компоненты, мы создаем новый репозиторий и используем его. Это называется множественным репо или множественным репо. Этот процесс будет продолжаться до тех пор, пока мы не создадим много репозиториев, так как нам понадобится один репозиторий для каждого пакета. Через некоторое время это становится неуправляемым.

Прежде чем двигаться дальше, давайте попробуем создать небольшое приложение с использованием ExpressJ.

Выполните приведенную ниже команду во вновь созданной папке. Это создаст файл package.json.

npm init

Новое приложение содержит два маршрута и не требует пояснений. Назовем его server.js.

const logger = require('./logger');
const express = require('express');
const app = express();
app.use(function (req, res, next) {
 logger.log(req.originalUrl, "Middleware");
 next()
});
app.get('/', (req, res) => {
 console.log("Hello work");
 res.send('Hello World!');
});
app.get('/info', (req, res) => {
 console.log("Info");
 res.send('This is info!');
});
app.listen(8080, function () {
 console.log("Server is running");
});

Затем добавьте регистратор для отслеживания каждого запроса. Вот содержимое logger.js.

const fsPromises = require('fs').promises
const log = async (value, context) => {
    const valueToBeLogged = `${new Date()}---${context}---${value}\n`;
    await fsPromises.appendFile("C://logger" + "//" + "track_data.log", valueToBeLogged);
};
exports.log = log;

Это будет работать без проблем. Весь код может находиться в репозитории. Но теперь давайте предположим, что регистратор нужно использовать совместно с другим проектом ExpressJs. у нас есть 2 варианта

  • Скопируйте / вставьте logger.js в другой проект.
  • Переместите logger.js в отдельный репозиторий и сделайте его пакетом.

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

Это когда мы выбираем Monorepo.

Что такое Монорепо?

В системах контроля версий монорепозиторий (слоговое сокращение от монолитного репозитория) представляет собой стратегию разработки программного обеспечения, при которой код для многих проектов хранится в одном репозитории. - википедия

Проще говоря, храните весь исходный код в одном репозитории.

💡 Monorepo не делает упор на монолитный дизайн программного обеспечения.

Это не новая концепция, и многие компании, включая Google, Facebook, Microsoft, Uber, Airbnb, Twitter, уже следят за ней.

Давайте посмотрим, как Google поддерживает различные пакеты angular в одном репозитории. Такой подход называется мульти-пакетным Monorepo.

Создайте новое приложение angular с помощью команды «ng new ‹app›» и проверьте файл package.json. Вы можете увидеть такие пакеты, как @ angular / core, @ angular / animations и т. Д.

Теперь перейдите к исходному коду angular https://github.com/angular/angular и проверьте папку пакетов.

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

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

Но в Multirepo, если вы хотите поделиться кодом между этими пакетами, единственный способ сделать это - опубликовать код в NPM и использовать его.

Управление Monorepo с помощью Lerna

Может показаться проще хранить весь исходный код в одном репозитории. Но это не так. Мы должны иметь возможность эффективно поддерживать управление версиями пакетов и коммитов кода. Для этого мы можем использовать инструмент под названием Lerna.



Давайте попробуем тот же пример приложения регистратора с использованием Lerna.

Сначала необходимо установить lerna на вашу машину.

npm install --global lerna

После установки lerna инициализируйте новый проект в новой папке с помощью Lerna.

lerna init

Если вы откроете папку, вы увидите следующие файлы.

packages/
  package.json
  lerna.json
  • перейдите в папку пакетов, создайте папку с именем app и добавьте файлы server.js, package.json.
  • создайте еще одну папку с именем logger в папке пакетов и добавьте logger.js, а затем запустите npm init для инициализации. Это создаст package.json. Задайте имя в package.json как «logger» и версию как «1.0.0».

Общая структура папок выглядит так.

  • откройте package.json внутри папки приложения и добавьте регистратор в раздел зависимостей.

  • Выполните приведенный ниже код, чтобы установить зависимости и связать регистратор с приложением.
lerna bootstrap

Это оно. теперь вы можете запустить приложение, перейдя в папку приложения. Если вы проверите node_modules папки приложения, вы увидите ссылку на папку журнала.

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

Весь код доступен здесь и здесь.

Совместное использование пакетов с проектами, которых нет в текущем репозитории

Одна из замечательных особенностей использования Lerna заключается в том, что она упрощает публикацию пакетов. Вы можете использовать реестр NPM, если хотите предоставить общий доступ к своему пакету и не требуется специальной настройки, или используйте собственный реестр, если вы хотите, чтобы пакеты оставались закрытыми. Просто запустите приведенную ниже команду, чтобы начать процесс публикации пакета.

lerna publish

Эта команда выполнит следующее

  1. зафиксировать код
  2. Измените версию в файле package.json
  3. создать тег в репозитории.
  4. опубликуйте пакет в реестр npm.
  5. отправьте код в репозиторий.

Плюсы Monorepo

  • Поддерживать зависимости между проектами очень просто. Код можно повторно использовать без публикации в NPM.
  • Применять один и тот же стиль кодирования / форматирования для нескольких проектов легко.
  • Делает совместное использование кода простым. Вы можете создать пользователя и привязать его к одному репозиторию.

Минусы Монорепо

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

Если вам понравилась эта статья, вы можете проверить другую мою статью.