Зарегистрируйтесь, чтобы продолжить обучение

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

Go-environment

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

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

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

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

package main

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

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

Но чтобы это код запустился, надо создать модуль.

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

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

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

go mod init github.com/hexlet/hello-hexlet                                             1 ↵
go: creating new go.mod: module github.com/hexlet/hello-hexlet
go: to add module requirements and sums:
        go mod tidy

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

module github.com/hexlet/hello-hexlet

go 1.23.0

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

Далее указывается минимальная совместимая версия языка (go 1.23) и список зависимостей. Пока список зависимостей пуст. Вывод команды создания модуля подсказывает нам, что добавить зависимости можно командой go mod tidy:

go mod tidy

go: finding module for package github.com/sirupsen/logrus
go: found github.com/sirupsen/logrus in github.com/sirupsen/logrus v1.9.3
go: downloading github.com/stretchr/testify v1.7.0
go: downloading gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c

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

module github.com/hexlet/hello-hexlet

go 1.23.0

require github.com/sirupsen/logrus v1.9.3

require golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect

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

...
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
...

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

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

Наконец, после установки зависимостей мы можем запусть наш код:

go run .

INFO[0000] Hello, Hexlet!

Зависимость установилась, и код заработал.

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

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

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

github.com/sirupsen/logrus v0.1.0 v0.1.1 v0.2.0 ...

По умолчанию команда 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: downloading github.com/stretchr/testify v1.2.2
go: added github.com/konsorten/go-windows-terminal-sequences v1.0.1
go: downgraded github.com/sirupsen/logrus v1.9.3 => 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

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

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

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

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