Расскажите об управлении зависимостями в Go. Какие инструменты для этого существуют?

Ответ

Современный стандарт управления зависимостями в Go — это Go Modules (go mod), встроенный в язык начиная с версии 1.11.

Go Modules

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

  • go.mod: Файл в корне проекта, который определяет модуль, его зависимости и их версии. Он создается командой go mod init <module_path>.
  • go.sum: Автоматически генерируемый файл, содержащий контрольные суммы каждой зависимости. Это гарантирует, что вы используете в точности те же версии пакетов, что и другие разработчики.

Основные команды:

# Инициализирует новый модуль в текущей директории
go mod init my/project

# Добавляет новые зависимости или обновляет существующие
go get github.com/sirupsen/logrus@v1.9.0

# Удаляет неиспользуемые зависимости из go.mod и добавляет недостающие
go mod tidy

# Загружает зависимости в локальный кеш
go mod download

Исторические инструменты

До появления Go Modules использовались другие подходы:

  1. GOPATH: Изначальный подход, при котором все проекты и их зависимости должны были находиться внутри единой директории $GOPATH. Управление версиями было ручным и неудобным.
  2. dep: Официальный, но экспериментальный инструмент перед go mod. Он использовал файлы Gopkg.toml и Gopkg.lock для фиксации версий.
  3. glide: Один из первых и популярных сторонних менеджеров зависимостей.

На сегодняшний день Go Modules является единственным рекомендуемым и повсеместно используемым способом управления зависимостями в Go.

Ответ 18+ 🔞

А, слушай, про управление зависимостями в Go? Ну это, блядь, целая эпопея, как история про Герасима и Муму, только с кодом, ёпта!

Вот сейчас, внатуре, золотой стандарт — это Go Modules (go mod). Встроили эту хуйню прямо в язык, начиная с версии 1.11, и слава богу, а то раньше был пиздец, как у Толстого до революции.

Go Modules: наше всё, блядь

Это такая система, которая за тебя всё делает: зависимости качает, версии фиксирует, чтобы у тебя и у твоего коллеги сборка не разъебалась в разные стороны. Основа основ — два файлика:

  • go.mod: Это как паспорт твоего проекта. Лежит в корне, говорит, как модуль зовут и какие пакеты ему, сука, нужны. Создаёшь командой go mod init my/project — и поехали.
  • go.sum: А этот файл автоматом генерируется, в нём контрольные суммы всех зависимостей. Это чтобы никакой левый пидорас не подсунул тебе изменённую библиотеку, пока ты не смотришь. Доверия, блядь, ноль ко всем.

Основные команды, которые надо знать:

# Инициализирует новый модуль в текущей директории
go mod init my/project

# Добавляет новые зависимости или обновляет существующие
go get github.com/sirupsen/logrus@v1.9.0

# Удаляет неиспользуемые зависимости из go.mod и добавляет недостающие
go mod tidy

# Загружает зависимости в локальный кеш
go mod download

А раньше-то, блядь, что было? Исторический ликбез!

Ой, ёпта, были времена, волосы дыбом встают! Как будто в каменном веке жили.

  1. GOPATH: Это, сука, самый древний способ. Представляешь, все твои проекты и все библиотеки от них должны были валяться в одной общей папке $GOPATH! Управлять версиями? Да хуй там! Ручками качал, ручками следил, чтобы ничего не сломалось. Полный распиздяйский подход, блядь.
  2. dep: Потом появился этот официальный, но экспериментальный инструмент. Уже лучше, файлы Gopkg.toml и Gopkg.lock были. Но всё равно как костыль, ёбаный в рот.
  3. glide: А это один из первых сторонних менеджеров, народ хватался за него, как утопающий за соломинку.

Короче, пиздец был, а не разработка. Сейчас-то всё просто: Go Modules — это единственный нормальный, рекомендованный и повсеместно используемый путь. Всё остальное — в утиль, в исторический музей, вместе с деревянными Чиполлино!