Управление зависимостями является проблемой для большинства разработчиков. Когда Go был впервые выпущен, не было встроенной системы управления пакетами, которая облегчала бы этот процесс. В результате сообщество создало сторонние пакеты, чтобы компенсировать отсутствие единого глобального решения. Каким бы большим вкладом они ни были, они создали множество проблем.

В частности, одна проблема заключалась в том, что один проект мог использовать несколько систем управления зависимостями разными командами в стеке, что в конечном итоге приводило к хаосу внутри репозитория. С выпуском версий 1.11 и 1.12 Go предоставил встроенное решение для обработки зависимостей с добавлением модулей. Модуль Go — это набор пакетов, хранящихся в репозитории с файлом go.mod в корне, который определяет путь к модулю каждого пакета, а также любые другие зависимости, необходимые для сборки.

В версии Go 1.11 была предложена команда go, упрощающая использование модулей, когда репозиторий не содержит файла go.mod и/или был создан вне $GOPATH/srcкаталог. Версия 1.13 выпущена с модульным режимом по умолчанию в качестве альтернативы GOPATH для управления версиями и распространения пакетов.

Инициализация модуля

Создайте каталог в любом месте по вашему выбору из любого места на вашем локальном компьютере. Этот пример иллюстрирует создание модуля в репозитории, отправленном на github. cd в свой репозиторий и выполните следующую команду:

$ go mod init github.com/chriskakos/my-repo

Эта команда создает файл go.mod. Откройте файл:

$ vi go.mod

Импорт зависимости

Вы можете запустить $ go get <package_name> из командной строки, чтобы импортировать зависимость, однако я решил быть более явным в своем примере и добавил его в свой файл main.go.

При добавлении или удалении пакетов рекомендуется выполнить команду $ go mod tidy перед запуском программы. Это кэширует импортируемый пакет и все его зависимости в файл GOPATH. Если пакет уже был кэширован, этот процесс пропускается. Если пакет был удален и/или больше не используется, он будет удален.

$ go mod tidy

После запуска $ go mod tidy снова откройте файл go.mod:

$ vi go.mod

Теперь перечислите все файлы из репозитория:

$ ls -la

В дополнение к go.mod команда go поддерживает файл с именем go.sum, содержащий криптографические хэши, представляющие содержимое определенной версии пакета.

Файл go.sum, чтобы гарантировать, что будущие загрузки этих модулей будут получать те же биты, что и при первой загрузке, и что модули, от которых зависит ваш проект, не изменятся неожиданно, будь то злонамеренно или случайно. И go.mod, и go.sum должны быть возвращены в систему контроля версий.

$ cat go.sum

Для получения дополнительной информации о пакете и его зависимостях вы можете запустить команду `$ go mod Why -m ‹package›`:

$ go mod why -m github.com/gorilla/websocket

Список зависимостей

Добавление одного пакета часто приводит к другим косвенным зависимостям. Чтобы получить список всех пакетов и их зависимостей, выполните команду go list -m all.

$ go list -m all

основной модуль всегда является первой строкой, за которой следуют зависимости, отсортированные по пути к модулю.

Вы можете получить список всех версий пакета, запустив go list -m -versions <package_name>.

$ go list -m -versions github.com/bwmarrin/discordgo

Зависимости от поставщиков

Вендоринг — это процесс, который загружает локальную копию всех зависимостей в ваш репозиторий. Это наиболее полезно, когда у вас есть поглощающее количество зависимостей, которые необходимо импортировать, без необходимости постоянно извлекать зависимости при каждой сборке. Вы можете продавать пакет, выполнив команду go mod vender.

$ go mod vendor

Удаление зависимостей

Я собираюсь явно проиллюстрировать процесс удаления зависимости из вашего репозитория. Откройте main.go и удалите этот пакет из import.

Затем выполните команду go mod tidy:

$ go mod tidy

(если вы продаете свои репозитории, повторно запустите команду go mod vendor)

$ go mod vendor

$ ls -la

Вывод

Модули Go — это шаг в правильном направлении с точки зрения гибкости с точки зрения управления версиями и распространения пакетов. Это было введением в работу с модулями, так как есть больше встроенных функций, которые помогают упростить различные процессы. Для более глубокого изучения я предлагаю Using Go Modules, авторыТайлер Буи-Палсулич и Ино Комптон.