Go модули
В следующих главах, посвящённых Go модулям, ты узнаешь:
-
что такое Go module и префикс импорта;
-
как изменить версию библиотеки и импортировать пакет;
-
как компилируется и запускается программа.
Также ты научишься создавать свой локальный модуль и запускать программу с использованием go module.
Что такое go module
В Go модулем принято называть любое приложение, которое можно опубликовать, версионировать, импортировать или скачать. С помощью модулей мы можем управлять зависимостями.
-
Модуль — это набор пакетов Go, хранящихся в файловом дереве с go.mod файлом в корне.
- Он похож на package.json из npm или composer.json из php composer и используется для управления зависимостями.
-
Мы можем использовать разные версии одной и той же зависимости, используя алиасы.
-
Базовая структура go.mod файла показана на скриншоте.
-
go mod init name для инициализации модуля go
- Обычно это host hosting the code/user or organisation/repo name: github.com/user/repo
-
go mod tidy: чтобы добавить сторонние пакеты и удалить не использованные из go.mod файла, когда ты добавляешь и удаляешь сторонние импорты из своих исходных файлов.
-
Если мы хотим получить некоторые модули, мы можем использовать go get github.com/username/reponame
Префикс импорта
Имя модуля — это префикс пути импорта для всех пакетов в модуле (локальных пакетов).
Загруженные модули Go хранятся локально по адресу $GOPATH/pkg/mod.
-
Происходит кэширование модуля для предотвращения повторных загрузок модуля.
-
Если ты загружаешь файлы с github, они будут располагаться внутри каталога github.com
Мы импортируем пакет, а не модуль. Поэтому укажи путь git к пакету.
Но файл go.mod будет иметь что-то вроде require github.com/ddadumitrescu/go_math v1.1.0, так как мы загружаем весь репозиторий.
Если мы делаем go get, то мы указываем путь к репозиторию.
Обновление зависимостей go get -u: эта команда будет работать только для минорных обновлений, а не для патчей и major__-версий.
Подробнее узнать про semver ты можешь по ссылке.
//indirect в файле go.mod означает, что ни один файл в проекте не использует этот пакет.
Мы можем использовать разные версии одного и того же пакета, применяя алиасы.