Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Модули и зависимости Go: Настройка окружения

Go-environment

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

Что такое модули

В Go модулем принято называть любое приложение, которое можно опубликовать, версионировать, импортировать или скачать. С помощью модулей мы можем управлять зависимостями.

Добавим в пример с Hello, Hexlet пакет для логгирования. В коде это будет выглядеть так:

package main

import "github.com/sirupsen/logrus" // Указываем путь до нужного пакета внутри репозитория

func main() {
    logrus.Println("Hello, Hexlet!")
}

Чтобы код запустился, надо этот пакет установить. Для этого можно использовать команду go get:

GO111MODULE=off go get "github.com/sirupsen/logrus" # О назначении GO111MODULE чуть позже

Далее можно запускать пакет командой go run:

GO111MODULE=off go run .

INFO[0000] Hello, Hexlet!

Зависимость установилась, и код заработал. Обратите внимание, что здесь мы использовали переменную окружения GO111MODULE=off — именно эта переменная отключает систему модулей.

Как создать модуль

Чтобы превратить папку с кодом в Go-модуль, можно использовать команду go mod init:

go mod init github.com/hexlet/hello-hexlet # Сразу указываем имя модуля

go: creating new go.mod: module github.com/hexlet/hello-hexlet

Команда сгенерировала go.mod файл со следующим содержимым:

module github.com/hexlet/hello-hexlet

go 1.17

Файл начинается с объявления имени модуля (module github.com/hexlet/hello-hexlet). Это уникальный идентификатор, по которому модуль хранится в индексе модулей Go. Обычно в качестве имени модуля указывают его адрес в репозитории.

Далее указывается минимальная совместимая версия языка (go 1.17) и список зависимостей. Пока список зависимостей пуст. Чтобы обновить его, можно воспользоваться командой go get, убрав переменную GO111MODULE=off. Но есть и другой способ — команда go mod tidy:

go mod tidy

go: finding module for package github.com/sirupsen/logrus
go: downloading github.com/sirupsen/logrus v1.8.1
go: found github.com/sirupsen/logrus in github.com/sirupsen/logrus v1.8.1
go: downloading golang.org/x/sys v0.0.0-20191026070338-33540a1f6037
go: downloading github.com/stretchr/testify v1.2.2
go: downloading github.com/pmezard/go-difflib v1.0.0
go: downloading github.com/davecgh/go-spew v1.1.1

Команда go mod tidy проверяет импорты в коде, загружает недостающие зависимости и удаляет лишние). Файл go.mod обновился и теперь включает в себя раздел с зависимостями:

module github.com/hexlet/hello-hexlet

go 1.17

require github.com/sirupsen/logrus v1.8.1

require golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 // indirect

Также появился файл go.sum:

github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
...
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

Оба файла обновляются при каждом добавлении или удалении зависимости:

  • Файл go.mod включает путь до модуля и его версию
  • Файл go.sum добавляет по две записи на каждую зависимость:
    • Первая запись с названием модуля, его версией и хэш-суммой
    • Вторая запись с хэш-суммой go.mod файла модуля

Как менять версии зависимостей

Модули предоставляют инструменты для работы с разными версиями пакетов. По умолчанию Go добавляет последнюю доступную версию пакета. В нашем примере это v1.8.1. Чтобы проверить, какие еще версии пакета доступны, используем команду go list:

go list -m --versions github.com/sirupsen/logrus

github.com/sirupsen/logrus v0.1.0 v0.1.1 v0.2.0 ... v1.7.0 v1.7.1 v1.8.0 v1.8.1

По умолчанию команда go list выдает адрес текущего пакета, по которому его можно импортировать. В примере выше мы использовали два флага:

  • -m указывает, что нас интересует только модуль, а не его пакеты
  • --versions указывает все возможные для скачивания версии пакета

Чтобы изменить версию, используем команду go get:

go get github.com/sirupsen/logrus@v1.5.0

go: downloading github.com/sirupsen/logrus v1.5.0
go: downloading github.com/konsorten/go-windows-terminal-sequences v1.0.1
go get: added github.com/konsorten/go-windows-terminal-sequences v1.0.1
go get: downgraded github.com/sirupsen/logrus v1.8.1 => v1.5.0

Как удалять зависимости

Удалить зависимость из проекта довольно просто — достаточно удалить импорт этой зависимости из кода и запустить go mod tidy. В обновленном файле go.mod этого модуля больше не будет.

Выводы

  • Модуль — это само приложение, в корне которого находится файл go.mod со списком зависимостей текущего модуля
  • Модуль создается командой go mod init
  • Чтобы добавить зависимость в модуль или изменить ее версию, используйте команду go get
  • Чтобы удалить зависимость, достаточно убрать ссылку на нее в коде и вызвать go mod tidy

Самостоятельная работа

  1. Создайте модуль на основе проекта hexlet-go

  2. Подключите библиотеку color и разукрасьте текст разными цветами

  3. Запустите программу и проверьте, что текст раскрашен


Дополнительные материалы

  1. How Do You Structure Your Go Apps
  2. Индекс модулей Go

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»