Управление зависимостями является проблемой для большинства разработчиков. Когда 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, авторыТайлер Буи-Палсулич и Ино Комптон.