Перейти до основного вмісту
Модуль 9 · Урок 4 із 544/50 у курсі~12 min
Модульні уроки (4/5)

Go модулі

Модуль Go — це блок із можливістю версії, що складається з одного або кількох пакетів. Це основа сучасної системи залежностей (Go 1.11+): жодних GOPATH, жодних обов’язкових vendor, явних і відтворюваних залежностей.

go.mod: маніфест модуля

Code
module example.com/myapp

go 1.22

require (
    github.com/google/uuid v1.6.0
    golang.org/x/time     v0.5.0
)

Три основні директиви:

  • module <path> — шлях імпорту модуля. Усі внутрішні пакунки імпортуються як example.com/myapp/sub/pkg. Це не обов’язково має бути справжня URL-адреса, але для публікації через go get вона має розв’язуватися.
  • go <version> — мінімальна необхідна версія Go (також використовується для керування дозволеними мовними функціями, наприклад, range-over-func у 1.23).
  • require — прямі залежності з їх точною версією.

Інші директиви: replace (замінює dep розгалуженням або локальним шляхом), exclude, retract.

go.sum: криптографічний файл блокування

Окрім go.mod, go.sum містить криптографічний хеш КОЖНОЇ завантаженої версії (включаючи транзитивні залежності). Це гарантує відтворюваність: якщо хтось підробить опубліковану версію, збірка зазнає збою.

Завжди фіксуйте його. Він автоматично оновлюється командами go.

Основні команди

Bash
go mod init example.com/myapp        # create go.mod
go get github.com/google/uuid        # add the dep at its latest version
go get github.com/google/uuid@v1.5.0 # specific version
go get -u ./...                      # upgrade every dep
go mod tidy                          # remove unused deps, add missing ones
go mod download                      # download everything into the cache
go mod why github.com/x/y            # explain why a dep is included
go mod graph                         # full dependency graph

go mod tidy — це той, який ви запускаєте після кожної зміни імпорту: він гарантує, що go.mod точно відображає пакети, які фактично використовувалися.

Семантичний імпорт версій (SIV)

Версії слідують за SemVer: v1.2.3 = MAJOR.MINOR.PATCH. Цікава частина major v2+:

  • Основні v0 та v1 → звичайний шлях: github.com/foo/bar.
  • Основна v2 або новіша → шлях включає основну версію: github.com/foo/bar/v2.
Go
import "github.com/foo/bar/v2"

Це дає змогу одночасно імпортувати v1 та v2 однієї бібліотеки (корисно під час поступових міграцій).

Шляхи імпорту та внутрішні пакети

Якщо ваш модуль example.com/myapp, підпапка utils/ імпортується як:

Go
import "example.com/myapp/utils"

Шлях залежить лише від назви, оголошеної в go.mod, а не від розташування на диску: той самий код в іншій папці продовжує працювати.

Режим робочої області (Go 1.18+)

Щоб працювати з декількома модулями, які посилаються один на одного одночасно (наприклад, бібліотека та програма, яка її використовує):

Bash
go work init ./lib ./app

Це створює go.work: go build використовуватиме локальну версію ./lib замість завантаження опублікованої. Не фіксуйте go.work (це середовище розробки).

вправи

вправи#go.m9.l4.e1
Спроби: 0Завантаження…

Модуль називається example.com/myapp і містить підпапку utils. Імпортуйте вкладений пакет у основний, використовуючи повний шлях.

Завантаження редактора…
Показати підказку

Шлях імпорту — це назва модуля (з go.mod) плюс відносний шлях папки.

Рішення доступне після 3 спроб

вправи#go.m9.l4.e2
Спроби: 0Завантаження…

Перетворіть окремі імпорти на групу імпорту за допомогою синтаксису імпорту ( ... ), імпортуючи як fmt, так і os.

Завантаження редактора…

Рішення доступне після 3 спроб

Quiz#go.m9.l4.e3
Готовий

Яка команда видаляє залежності, які більше не імпортуються з go.mod, і додає відсутні?

Go
$ go mod ???
Варіанти відповідей