Модульні уроки (4/5)
Go модулі
Модуль Go — це блок із можливістю версії, що складається з одного або кількох пакетів. Це основа сучасної системи залежностей (Go 1.11+): жодних GOPATH, жодних обов’язкових vendor, явних і відтворюваних залежностей.
go.mod: маніфест модуля
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.
Основні команди
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 graphgo 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.
import "github.com/foo/bar/v2"Це дає змогу одночасно імпортувати v1 та v2 однієї бібліотеки (корисно під час поступових міграцій).
Шляхи імпорту та внутрішні пакети
Якщо ваш модуль example.com/myapp, підпапка utils/ імпортується як:
import "example.com/myapp/utils"Шлях залежить лише від назви, оголошеної в go.mod, а не від розташування на диску: той самий код в іншій папці продовжує працювати.
Режим робочої області (Go 1.18+)
Щоб працювати з декількома модулями, які посилаються один на одного одночасно (наприклад, бібліотека та програма, яка її використовує):
go work init ./lib ./appЦе створює go.work: go build використовуватиме локальну версію ./lib замість завантаження опублікованої. Не фіксуйте go.work (це середовище розробки).
вправи
Модуль називається example.com/myapp і містить підпапку utils. Імпортуйте вкладений пакет у основний, використовуючи повний шлях.
Показати підказку
Шлях імпорту — це назва модуля (з go.mod) плюс відносний шлях папки.
Рішення доступне після 3 спроб
Перетворіть окремі імпорти на групу імпорту за допомогою синтаксису імпорту ( ... ), імпортуючи як fmt, так і os.
Рішення доступне після 3 спроб
Яка команда видаляє залежності, які більше не імпортуються з go.mod, і додає відсутні?
$ go mod ???