Изучаем Go – Наконец-то используем модули
Помните это?
mkdir $GOTPATH/github.com/shindakun/mailgunner mkdir $GOTPATH/github.com/shindakun/mailgunner/client
Сомневаюсь, что помните, если не читали предыдущий пост об отправке электронной почты через MailGun. Прошлый вариант немного небрежный, и я так сделал только для того, чтобы было проще использовать пакет локально с соответствующим примером. Мне это не очень понравилось и я до сих пор не опубликовывал этот пример на GitHub из-за этого. Итак, решил, что могу написать краткий пост как же сделать mailgunner правильным модулем Go.
Подготовимся
Первое, что с чего мы начнем - создадим каталог за пределами $GOPATH. Вы можете использовать модули внутри каталога, с переменной окружения GO111MODULE = on, но, поскольку мы хотим работать вне каталога $GOPATH, мы пойдем иным путем.
mkdir ~/Code/mailgunner
Теперь создадим main.go и откроем в VS Code.
touch main.go code .
Я заранее написал код, поэтому я просто вставляю его. Обратите внимание, что я обновил имя пакета с client на mailgunner. К тому же я добавил простенькие комментарии к экспортируемым функциям. Это даст нам некоторые преимущества, при использовании Intellisense в VS Code. Хотя, наверное, нужно сделать их немного более практичными и полезными.
Я не буду снова повторять код, просто предоставлю вам его здесь, чтобы не приходилось переходить к репозиторию или предыдущей статье. * Примечание: я немного изменил постфактум код и переименовал функцию NewMgClient в более корректную функцию New().
package mailgunner import ( "net/http" "net/url" "strings" ) // MgClient struct holds our URL and API key type MgClient struct { MgAPIURL string MgAPIKey string Client *http.Client } // New returns our MgClient with the proper settings func New(apiurl, apikey string) MgClient { return MgClient{ apiurl, apikey, http.DefaultClient, } } // FormatEmailRequest puts everything together for sending func (mgc *MgClient) FormatEmailRequest(from, to, subject, body string) (r *http.Request, err error) { data := url.Values{} data.Add("from", from) data.Add("to", to) data.Add("subject", subject) data.Add("text", body) r, err = http.NewRequest(http.MethodPost, mgc.MgAPIURL+"/messages", strings.NewReader(data.Encode())) if err != nil { return nil, err } r.SetBasicAuth("api", mgc.MgAPIKey) r.Header.Add("Content-Type", "application/x-www-form-urlencoded") return r, nil }
Чтобы сделать правильный модуль, нам нужно его инициализировать.
$ go mod init github.com/shindakun/mailgunner go: creating new go.mod: module github.com/shindakun/mailgunner
Теперь давайте настроим репозиторий Git. Если вы не знакомы с Git, рекомендую скорее начать его изучать. Pro Git доступен онлайн бесплатно.
git init git add . git commit -m "Initial commit" git remote add origin https://github.com/shindakun/mailgunner.git git push -u origin master
Теперь, чтобы начать в полной мере использовать модули Go, нам нужно присвоить нашему выпуску номер версии. Мы будем следовать Semantic Versioning, пометим выпуск как версия 1 или v1.0.0 и переместим этот тег на Github.
git tag v1.0.0 git push --tags
Используем модули
Все отлично - но как мы будем это использовать? В репозитории на гите лежит пример кода. Идем дальше и клонируем репо в каталог за пределами вашей $GOPATH. Перейдем к каталогу примеров. После инициализируем его, чтобы использовать модуль. Наконец, запустим go build, выглядеть это будет примерно так:
$ go mod init example go: creating new go.mod: module example $ go build go: finding github.com/shindakun/mailgunner v1.0.0 go: downloading github.com/shindakun/mailgunner v1.0.0
Посмотрите на это! Не надо больше использовать go get!
В продолжении
Я хочу немного посмотреть на веб-серверы в Go, поэтому, мы, вероятно, рассмотрим создание простых серверов. Возможно, их уровень не будет дотягивать до уровня продакшн решения, но все равно должно быть забавно размещать их в Интернете, чтобы протестить на практике. У меня были и другие идеи простеньких проектов, чтобы попробовать разные компоненты и технологии на практике. Сначала я их выучу, а потом уже, наверное, расскажу вам, посмотрим.
До встречи!
Другие статьи из цикла:
- Изучаем Go - создание загрузчика (часть 1)
- Изучаем Go - создание загрузчика (часть 2)
- Изучаем Go - создание загрузчика (часть 3)
- Изучаем Go - создание загрузчика (часть 4)
- Изучаем Go - создание загрузчика (часть 5)
- Изучаем Go - Использование REST API
- Изучаем Go - Продолжаем работать с REST API
- Изучаем Go - Отправка REST-запросов
- Изучаем Go - Используем REST API в паре с шаблонами проектирования
- Изучаем Go - Повторная отправка электронной почты через API
- Изучаем Go – Наконец-то используем модули
- Изучаем Go - Давайте станем модульными снова!
- Изучаем Go - Сборка DevLog Часть 01
- Изучаем Go - Сборка DevLog Часть 02
- Изучаем Go - Сборка DevLog Часть 03
- Изучаем Go - Сборка DevLog Часть 04