Найти в Дзене
Wissance

Разбираемся с версиями собственных пакетов и модулей в Go на примере

Версия модуля и пакета в Go. Как присвоить читаемую версию (например 1.12.3) своему модулю? Все это в статье.
Оглавление

Прежде всего разберемся с тем, что такое модуль и что такое пакет. Согласно официальной документации:

1. Модуль - коллекция пакетов, которая версируется, выпускается и распространяется вместе

2. Пакет - набор исходников, которые находится в одной директории и собираются вместе в один бинарник.

Как правило, общий код переносится в отдельные модули, пакеты которых загружаются менеджером пакетов go через одноименную утилиту с параметром get, т.е. так - go get {package} загрузка происходит в виде исходников из репозитория, далее на этой же машине эти исходники с исходниками разрабатываемого приложения компилируются в один общий .exe-файл, который содержит в себе все, что требуется приложению для работы, ни каких тебе дополнительных .so, .dll, хитрых и кучи связанных с ними зависимостей. Это удобно!

При этом мы (я имею всех разработчиков в целом) когда разрабатываем хотим иметь какой-то человеческий формат версий наших модулей и их пакетов. Согласно приведенной ранее официальной документации для этого нам необходимо задать версию в формате: major.minor.patch при этом необходимо чтобы были использованы ВСЕ ТРИ ЧИСЛА, иначе будет подставлена псевдо версия, которая выглядит как: v.0.0.0-{timestamp}-{commithash}, например: v0.0.0-20191109021931-daa7c04131f5 (см. описание псевдо версий). Поэтому рассмотрим 2 момента здесь: как задать версию модулю и как обновить модуль если до этого использовалась псевдо-версия. Все манипуляции будем проводить на нашем (wissance) опэн сорс проекте gwuu, который мы рассматривали в данной статье.

Добавляем версию в собственный модуль правильно

Честно говоря, тут нет никакой магии все тривиально: нужно создать тэг, который будет содержать 3 числа, например, v1.0.0 иначе тэг будет игнорироваться (перед номером обязательно должна стоять буква "v", как в примере), я, например, создал тэг v1.0a и go мне сказал, что у моего модуля нет версии, а значит будет использоваться псевдо-версия:

Зеленым прямоугольником я выделил подходящий формат версии, красным - некорректный.
Зеленым прямоугольником я выделил подходящий формат версии, красным - некорректный.

Маленькое дополнение по тэгу, как я понял тэг должен быть в главной ветке репозитория, github стал заниматься какой-то ерундой и по дефолту ставить main, поэтому обращайте на это внимание.

Обновляем версию пакета с псевдо версии до нормального варианта

Я в данном случае рассмотрю, что нужно сделать, чтобы обновить версию используемого модуля github.com/wissance/gwuu с псевдо на 1.0.0

1. Необходимо из файла go.mod в проекте/части проекта удалить строку с зависимостью для которой установлена псевдо версия:

Удаляем зависимость с псевдо версией
Удаляем зависимость с псевдо версией

2.Удаляем из go.sum упоминания нашего модуля:

Удаляем зависимость с псевдо версией
Удаляем зависимость с псевдо версией

3. Далее, как мне кажется, необязательный шаг (но я его выполнил) удаляем из $GOROOT/pkg/mod/{путь к модулю} и из $GOROOT/src/{путь к исходникам}

4. После для сборки будет подтянута актуальная версия модуля и его пакетов. Профит!

Казалось бы все просто, но для этого нужно тщательно читать мануалы.