Створення та публікація модуля¶
Модуль — це набір пакетів, версіонованих разом; одиниця, якою Go
розповсюджує код і залежить від нього. Його визначає файл go.mod у
корені, який називає модуль і записує його залежності. Один модуль зазвичай
відповідає одному репозиторію.
Започаткування модуля¶
go mod init створює go.mod. Аргумент — це шлях модуля (module
path): префікс імпорту для кожного пакета всередині та (для опублікованих
модулів) місце, звідки його можна завантажити.
Рядок module задає префікс імпорту: пакет у store/ тепер імпортується
як example.com/shop/store. Рядок go записує версію мови, на яку
націлений модуль.
З погляду Python:
go.mod— це приблизний відповідникpyproject.toml: він називає проєкт і фіксує залежності. Немає virtualenv: граф модулів вирішується на кожну збірку, а залежності кешуються глобально.
Додавання залежності¶
Імпортуйте пакет і дайте інструментам його завантажити. go get додає
його; go mod tidy узгоджує go.mod/go.sum із тим, що код насправді
імпортує.
Це записує залежність та її точну версію в go.mod і пише криптографічні
контрольні суми у go.sum, щоб майбутні збірки перевіряли, що отримали
ідентичні байти.
go.sum — це не lock-файл у сенсі npm: go.mod уже фіксує точні версії;
go.sum — це запис цілісності. Комітьте обидва.
Семантичне версіонування та кеш модулів¶
Модулі Go використовують семантичне версіонування
(vMAJOR.MINOR.PATCH). Вибір версії — це Minimal Version Selection:
збірка бере найнижчу версію, що задовольняє всі вимоги, тож збірки
відтворювані без окремого lock-файлу. Завантажені модулі живуть у
глобальному кеші лише для читання, спільному для проєктів.
Оновлення є явними:
go get github.com/google/uuid@latest # найновіша
go get github.com/google/uuid@v1.6.0 # конкретна версія
go get github.com/google/uuid@none # видалити
Мажорні версії: правило /vN¶
Зворотно несумісна зміна означає нову мажорну версію, і з v2 мажорна
версія стає частиною шляху модуля:
Тоді ті, хто імпортує, пишуть example.com/shop/v2/store. Це дозволяє v1
та v2 співіснувати в одній збірці — інша відповідь на конфлікти
залежностей, ніж модель Python із однією версією на середовище.
Публікація¶
Немає центрального реєстру, куди завантажувати. Опублікувати модуль — це просто запушити позначений тегом коміт у публічний репозиторій, URL якого збігається зі шляхом модуля.
Коли хтось уперше запускає go get example.com/shop@v1.0.0, інструменти Go
завантажують його прямо з репозиторію (часто через проксі модулів) і
записують контрольну суму. Шлях модуля має збігатися з розташуванням
репозиторію, щоб інструменти знали, де шукати.
Заміна залежності (локальна чи форк)¶
Директива replace підміняє залежність іншою версією, форком чи локальним
шляхом — безцінно під час паралельної розробки двох модулів:
// go.mod
require example.com/lib v1.2.0
replace example.com/lib => ../lib // використати локальну копію
replace діє локально для збірки: вона впливає лише на збірки цього
модуля, а не на тих, хто залежить від вас.
Швидка довідка¶
| Команда / директива | Призначення |
|---|---|
go mod init <path> |
створити go.mod, задати шлях модуля |
go get <pkg>@<ver> |
додати / оновити / зафіксувати залежність |
go get <pkg>@none |
видалити залежність |
go mod tidy |
синхронізувати go.mod/go.sum з імпортами |
go.sum |
контрольні суми для цілісності (комітьте) |
require |
залежність та її версія |
replace A => B |
підмінити залежність (локальна/форк) |
/vN у шляху модуля |
мажорні версії ≥ 2 |
git tag vX.Y.Z + push |
опублікувати версію |