В предыдущем посте мы сделали модуль Go. Очень часто при разработке модулей он используется другими разработчиками в своих модулях. Вы должны следовать некоторым передовым методам, чтобы обеспечить надежный и последовательный опыт для разработчиков, использующих модуль. В этом разделе описывается первый шаг этого рабочего процесса.

Написать код локального клиента

Перед публикацией вашего модуля и его загрузкой другими разработчиками (командой go get) и использованием рекомендуется протестировать его локально. Давайте создадим новый модуль приветствие-пользователь, который будет использовать модуль, который мы создали в предыдущей части.

В каталоге, где находится ваш модуль «приветствие», создайте новый, набрав команду:

$ go mod init example.com/greeting-user
go: creating new go.mod: module example.com/greeting-user 

Чтобы указать командам Go использовать локальную копию кода модуля, используйте директиву replace в файле go.mod, чтобы заменить путь к модулю, указанный в директиве require. Используйте следующие команды для настройки пары «требовать/заменить»:

go mod edit -replace=example.com/[email protected]=../greeting 

Эта команда использует директиву replace в файле go.mod:

$ cat go.mod
module example.com/greeting-user

go 1.19

replace example.com/greeting v0.0.0-unpublished => ../greeting

Затем используйте go get, чтобы получить модуль greeting в модуль greeting-user:

$ go get example.com/[email protected]
go: added example.com/greeting v0.0.0-unpublished

Теперь наш файл go.mod выглядит так:

$ cat go.mod
module example.com/greeting-user

go 1.19

require example.com/greeting v0.0.0-unpublished

replace example.com/greeting v0.0.0-unpublished => ../greeting

Вы видите, что модуль greeting требуется, но заменяется модулем, который находится в папке ../greeting. Директива replace указывает команде go get, где искать нужный модуль.

Теперь давайте локально проверим, работает ли модуль, который мы создали на предыдущем шаге. Создайте файл main.go в каталоге greeting-user :

package main

import (
 "net/http"
 
 "example.com/greeting/api"
)

func main() {
 http.HandleFunc("/greeting", api.HandleGreetingRequest())
 http.ListenAndServe(":8080", nil)
}

Вы можете видеть, что мы используем функцию HandleGreetingRequest из модуля greeting. Теперь мы можем запустить программу и протестировать ее (выполните эту команду из каталога greeting, а также убедитесь, что на порту :8080 не запущена другая программа):

go run main.go

Затем откройте новый терминал и отправьте запрос на сервер:

$ curl -X GET http://localhost:8080/greeting
Hello! 

Как видите, программа работает корректно. Наш модуль greeting-user имеет только один go.mod и один main.go, но может обрабатывать HTTP-запросы от пользователей. Это возможно, потому что мы повторно используем код из модуля greeting.

Номер версии модуля

Номер версии модуля — это число, которое разработчик использует для обозначения стабильности версии и обратной совместимости модуля. Вот пример:

Каждое число дает различную информацию о модуле и его стадии.

  • v0.x.x или v0.0.0–20170915032832–14c0d48ead0c — это номер псевдоверсии и означает, что модуль находится в разработке и нестабилен. Этот выпуск не содержит гарантий обратной совместимости или стабильности. Инструменты Go генерируют псевдономера версий, если модуль не был помечен в своем репозитории. Этот тип версии полезен, когда вам нужен код модуля, который еще не помечен.
  • v1.x.x — основная версия сигнализирует об обратно несовместимых изменениях общедоступного API. Этот выпуск не гарантирует, что он будет обратно совместим с предыдущими основными версиями. Номер версии v1 или выше указывает на то, что модуль стабилен для использования (за исключением его предварительных версий). Версия v0 не гарантирует стабильность. Разработчики увеличивают это число больше 1 только в случае необходимости, потому что обновление основной версии означает значительный сбой для разработчиков, использующих модуль.
  • vx.1.x — минорная версия сигнализирует об обратно совместимых общедоступных API. Этот выпуск гарантирует обратную совместимость и стабильность.
  • vx.x.1 — версия исправления сообщает об изменениях, которые не влияют на общедоступный API модуля или его зависимости. Этот выпуск гарантирует обратную совместимость и стабильность.
  • vx.x.x-beta2 — предварительная версия указывает на то, что это предварительная веха, например альфа- или бета-версия. Этот релиз не дает гарантий стабильности.

Заключение

Теперь, когда вы видите, что ваш код работает, вы можете опубликовать предварительную версию и сделать модуль видимым для других разработчиков. Они могут скачать, протестировать его и оставить отзыв. Предварительная версия не гарантирует стабильность, поэтому будьте осторожны при загрузке модулей. На следующем шаге мы увидим, как пометить код модуля в вашем репозитории, указав в теге пререлизный идентификатор.