Что такое директория `vendor` в Go и для чего она используется?

Ответ

Директория vendor в Go — это механизм для изоляции зависимостей проекта. Она содержит точные копии всех сторонних библиотек, от которых зависит проект. Когда эта директория присутствует, компилятор Go по умолчанию использует пакеты из неё, а не из глобального кэша модулей.

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

Как это работает:

  1. Вы управляете зависимостями в файле go.mod.
  2. Выполняете команду go mod vendor.
  3. Go создаёт директорию vendor и копирует в неё исходный код всех зависимостей из go.mod.

Пример структуры проекта:

myproject/
  ├── go.mod
  ├── go.sum
  ├── main.go
  └── vendor/      <-- Создается командой `go mod vendor`
      ├── github.com/
      ├── golang.org/
      └── ...

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

  • go mod vendor — создаёт или обновляет директорию vendor.
  • go build -mod=vendor — принудительно использует зависимости из vendor (начиная с Go 1.14, этот флаг часто не требуется, если директория vendor существует).

Преимущества:

  • Изоляция и воспроизводимость: Сборка не зависит от внешних факторов и всегда будет использовать одни и те же версии кода.
  • Работа в оффлайн-режиме: Проект можно собрать без доступа к интернету.
  • Контроль: Полный контроль над кодом зависимостей, который можно даже аудировать или модифицировать при необходимости.

Недостатки:

  • Размер репозитория: Директория vendor может значительно увеличивать размер репозитория.
  • Ручное обновление: Требуется не забывать выполнять go mod vendor после каждого изменения в go.mod.