Перейти до змісту

Створення та публікація модуля

Модуль — це набір пакетів, версіонованих разом; одиниця, якою Go розповсюджує код і залежить від нього. Його визначає файл go.mod у корені, який називає модуль і записує його залежності. Один модуль зазвичай відповідає одному репозиторію.

Започаткування модуля

go mod init створює go.mod. Аргумент — це шлях модуля (module path): префікс імпорту для кожного пакета всередині та (для опублікованих модулів) місце, звідки його можна завантажити.

go mod init example.com/shop
// go.mod
module example.com/shop

go 1.25.0

Рядок module задає префікс імпорту: пакет у store/ тепер імпортується як example.com/shop/store. Рядок go записує версію мови, на яку націлений модуль.

З погляду Python: go.mod — це приблизний відповідник pyproject.toml: він називає проєкт і фіксує залежності. Немає virtualenv: граф модулів вирішується на кожну збірку, а залежності кешуються глобально.

Додавання залежності

Імпортуйте пакет і дайте інструментам його завантажити. go get додає його; go mod tidy узгоджує go.mod/go.sum із тим, що код насправді імпортує.

go get github.com/google/uuid
go mod tidy        # додати відсутнє, прибрати невживане

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

// go.mod
require github.com/google/uuid v1.6.0

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 мажорна версія стає частиною шляху модуля:

module example.com/shop/v2

Тоді ті, хто імпортує, пишуть example.com/shop/v2/store. Це дозволяє v1 та v2 співіснувати в одній збірці — інша відповідь на конфлікти залежностей, ніж модель Python із однією версією на середовище.

Публікація

Немає центрального реєстру, куди завантажувати. Опублікувати модуль — це просто запушити позначений тегом коміт у публічний репозиторій, URL якого збігається зі шляхом модуля.

git tag v1.0.0
git push origin v1.0.0

Коли хтось уперше запускає 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 опублікувати версію

Джерела