Skip to content

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 означает, что ни один файл в проекте не использует этот пакет.  

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