Ответ
Директория vendor в Go — это механизм для изоляции зависимостей проекта. Она содержит точные копии всех сторонних библиотек, от которых зависит проект. Когда эта директория присутствует, компилятор Go по умолчанию использует пакеты из неё, а не из глобального кэша модулей.
Это обеспечивает воспроизводимость сборок, так как проект становится полностью самодостаточным и не зависит от доступности внешних репозиториев или изменений в них.
Как это работает:
- Вы управляете зависимостями в файле
go.mod. - Выполняете команду
go mod vendor. - 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.