Ответ
В DevOps-практике для управления версиями зависимостей и модулей используются несколько подходов, часто в комбинации с Git.
1. Git Submodules (Подмодули) Используется, когда нужно включить другой Git-репозиторий как подкаталог в вашем проекте, зафиксировав конкретный коммит.
# Добавить подмодуль, указывающий на конкретную ветку
git submodule add -b main https://github.com/example/another-repo.git lib/another-repo
# Инициализировать и обновить все подмодули (после клонирования)
git submodule update --init --recursive
# Зафиксировать текущее состояние подмодулей (коммиты) в основном репозитории
git add .gitmodules lib/another-repo
git commit -m "Add submodule at specific commit"
- Плюс: Прямая привязка к коммиту.
- Минус: Усложняет workflow, требует ручного обновления.
2. Git Tags (Теги) + Менеджеры зависимостей
Наиболее распространенный подход. Репозиторий модуля помечается семантическими тегами (v1.2.3), а основной проект ссылается на этот тег через файл зависимостей.
- Для Go (go.mod):
module github.com/my/project require github.com/example/module v1.2.3 // Указывается тег напрямую - Для Node.js (package.json):
{ "dependencies": { "some-package": "git+https://github.com/user/repo.git#v1.0.0" } } - Для Python (requirements.txt / pyproject.toml):
# requirements.txt git+https://github.com/user/repo.git@v1.0.0#egg=package-name# pyproject.toml (Poetry) [tool.poetry.dependencies] my-package = {git = "https://github.com/user/repo.git", tag = "v1.0.0"}
3. Монополи (Monorepo) Все модули/сервисы хранятся в одном репозитории. Версии синхронизированы по умолчанию, так как изменения происходят в одном коммите. Управление осуществляется через инструменты вроде Bazel, Nx, Lerna или Turborepo.
Рекомендация: Для внутренних библиотек в DevOps-цепочке часто используют теги + менеджер пакетов (например, внутренний Nexus, Artifactory, GitHub Packages) для бинарных артефактов, а Git используется как источник истины для исходного кода.