Рубрики
Без рубрики

Почему я решил использовать моно-репозиторий для большого проекта Gradle

Прежде всего, моно-репо не означает монолитный, даже если монолитный означает моно-репо 😉 И этот пост… Помечено производительностью, github, java, kotlin.

Прежде всего, моно-репо не означает монолитный, даже если монолитный означает моно-репо 😉 И этот пост не относился только к проекту Gradle.

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

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

Мультирепо – не лучшее решение, когда вы единственный разработчик и у вас нет рабочей нагрузки, чтобы управлять всем. Я объясню вам, почему, в своем коротком рассказе.

Управлять зависимостями во всех моих разных репозиториях стало сложно

Однажды я попытался использовать функцию Kotlin, которую я уже использовал в другом репозитории, и она не сработала… Чего не хватает в моем проекте, чтобы использовать эту простую функцию, представленную в 1.3.60 версия… О, я понимаю.

Я видел, что:

plugins {
    id "org.jetbrains.kotlin.jvm" version "1.3.61"
}

И в другом хранилище:

plugins {
      id "org.jetbrains.kotlin.jvm" version "1.3.52"
}

Хорошо… Я забыл обновить свою версию Kotlin в репозитории… Упс.

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

В один прекрасный день появляется новая функция GitHub: Зависеть от. Посмотрите здесь . Я расскажу об этом в другом посте .

Я добавил его в каждый репозиторий, чтобы помочь мне управлять версией зависимостей. Каждую неделю мне приходилось делать одно и то же во всех моих хранилищах… Увеличьте версию зависимостей и убедитесь, что она ничего не сломает.

Так много времени отнимает.. Я одинок и трачу время на зависимости… Разочаровывающий.

Совместное использование кода между репозиториями является болезненным

Плохая история началась, когда я захотел использовать что-то из репо в другое… Я начинаю копировать и вставлять необходимый код через репозитории. Подумав, я займусь этим позже. Мы все знаем, что дублирование кода – очень плохая идея.

Я внес кардинальные изменения в эту общую часть, очень кардинальные, и… Маленький репозиторий, затерянный в большом море репозиториев, не получил своего обновления. Знаешь что? Все действительно взорвалось. Я, конечно, быстро это исправляю но… Что делать, если мой проект был чрезмерно использован, как Facebook?

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

Управление пакетами отнимает очень много времени. В самом деле! Когда я где-то публиковал репо, мне приходилось обновлять его повсюду. И…. Та же самая картина действительно появилась. Я забыл изменить версию в одном репозитории, и снова появляются ошибки.

Публикация частного репозитория не была решением проблемы. (

проекты в среде IDE и проблемы, которые трудно исправить

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

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

Управлять всеми различными проектами в рамках моей ИДЕИ IntelliJ стало сложно. У меня часто открывалось несколько окон.

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

Я погружаюсь в проект моно-репо. На первых порах это было довольно сложно. Я действительно потерял несколько дней, а потом.. Мне удается создать моно-репозиторий со всеми моими репозиториями без потери коммитов. С помощью одной простой команды git:

git subtree add --prefix=projects/service-A git://github.com/my-company/service-A.git master

Сделав это для каждого репозитория, я наконец получил каталог ( проекты ) со всеми моими сервисами.

Философия здесь такова: один build.gradle чтобы управлять ими всеми .

Все зависимости и плагины управляются корневым build.gradle и все микросервисы разделены на два проекта x-сервис и x-общий . И я могу легко включить проект x-shared из любых других проектов в мое моно-репозиторий. Мне не нужно иметь дело с пакетами maven и любыми другими трудоемкими вещами.

У меня так есть что-то вроде:

 - build.gradle
 - settings.gradle
 - projects
        - first-service
        - first-shared
        - second-service
        - third-service
        - thrid-shared
        - ...

Корневой build.gradle управляет всем для каждого подпроекта благодаря весь проект и подпроекты компонент.

Поскольку у меня было много подпроектов, вместо того, чтобы включать их все, я сделал простой скрипт в своем корневом файле settings.gradle :

file("projects").eachDir { p ->
    include p.name
    project(":${p.name}").projectDir = p
}

Он включает в себя все подпроекты из каталога проектов и переименовывает их в : первая услуга вместо : проекты: первая услуга , что неудобно.

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

Моно-репо сопряжено с другими сложностями. Но мне удается справиться со всеми ними, и теперь моно-репо очень помогает мне в моей повседневной работе. Наконец-то я могу сосредоточиться на своем коде.

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

Я объясню, как я управляю зависимостями, плагинами, CI/CD и всем остальным с помощью моно-репозитория Gradle в других сообщениях. Не забудь последовать за мной, чтобы посмотреть, что будет дальше.

Я буду рад услышать о ваших впечатлениях в комментариях!

Оригинал: “https://dev.to/scorsi/why-i-choose-to-use-a-mono-repo-for-a-very-large-project-hkp”