Как стать автором
Обновить

Автоматизация go get — больше не нужно запоминать названия библиотек

Время на прочтение 3 мин
Количество просмотров 4.2K

Всем привет! Когда я начинал писать на Go, я стартовал и забрасывал с десяток мелких пет-проектов. Большинство из них использовали fasthttp и его fasthttp/router. И пакет testify - обязательно. Позже пришло время творить уже бизнес-сервисы внутри своей компании, количество библиотек росло. И каждый раз, когда я создавал новый репозиторий, первое, что мне надо было сделать - добавить библиотеки, которые я буду использовать. Для этого использовался go get, ведь в руках у меня уже go 1.11 и нужно формировать go.mod. Обычно нужные библиотеки копируются из go.mod соседнего проекта. Но копипаст - не наш метод!

Да, я точно помню, в тот день я в очередной раз вспоминал как правильно пишется github.com/valyala/fasthttp и даже почти не ошибся - всего лишь пропустил букву t в слове github. И я понял, что пришло время автоматизации ... go get. Гугление похожего инструмента на тот момент ничего не дало, так что решил делать что-то своё. Инструмент назовём, скажем, gost - Go Start

Что хотелось в первую очередь:

  1. Не хочу запоминать названия библиотек, хочу иметь для них синонимы.

  2. Есть набор библиотек, которые ставятся сразу пачкой, бандлом - например fasthttp и роутер для него. Или gorm и его драйвер для PostgreSQL - такое хочется ставить одним синонимом.

  3. Хочу указывать набор альясов в одной команде, пусть тащит их скопом. Например: gost webserver gormpg prometheus cli.

  4. Конфигурировать хочу в YAML.

  5. Не буду ничего велосипедить, моя задача вызывать go get.

  6. Хочу иметь настройки по умолчанию, вшитые в бинарник.

  7. Для тестирования и отладки хочу иметь режим soft launch - когда на самом деле утилита ничего не делает, а только покажет список команд, которые вызовет.

Будем делать всё максимально просто - есть конфиг (так как начинал уже во времена go 1.16, то это просто embedded YAML), в нем есть список альясов для библиотек и бандлов. Читаем командную строку, если находим альяс - подставляем его значение и запускаем обычный go get.

Если включить режим soft launch выглядеть это может, например, так:

gost mod webserver -s
Use soft Launch

/usr/local/go/bin/go get -u github.com/valyala/fasthttp
/usr/local/go/bin/go get -u github.com/fasthttp/router
/usr/local/go/bin/go get -u github.com/stretchr/testify
/usr/local/go/bin/go get -u github.com/satmaelstorm/envviper
/usr/local/go/bin/go mod download

Ок, у меня заработало и мне, в целом, всё нравится. Но есть же другие люди, им мои альясы, а тем более мои наборы библиотек (бандлы) могут не подходить. Надо дать возможность заменять зашитый конфиг внешним.

Сказано - сделано. В первой итерации почему-то в голову пришло заменять конфиг из командной строки:

gost mod --aliases=aliases.yaml webserver pgsql

Хм. Что-то тут не так. Это же неудобно! Каждый раз надо указывать этот параметр. Давайте определим переменную окружения, указывающую на нужный файл, который и будем читать при каждом запуске утилиты:

export GOST_ALIASES="/home/user/gost.aliases.yaml"

Вот теперь удобно.

Ну а что, если базовые настройки в целом устраивают, но хочется что-то перезаписать или добавить что-то своё? Тогда определим еще одну переменную окружения, которая укажет на файл с добавлениями\заменами относительно базовой конфигурации (как зашитой, так и переопределенной):

export GOST_ADD_ALIASES="/home/user/gost.aliases.yaml"

Теперь у нас есть всё, чтобы показать это другим разработчикам на Go, достаточно им выполнить у себя:

go install github.com/satmaelstorm/gost@latest

Репозиторий утилиты для интересующихся тут, в нем можно найти и зашитый пример конфигурации альясов. Там же чуть более подробный README - так как возможностей чуть-чуть больше, чем я описал. Например, я показывал вам саб-команду mod, а есть еще start.

P.S. Да, утилиту я сделал давно и давно ей пользуюсь. Только сейчас донес ее до сообщества. Готов к доработкам по запросам коллег.

Теги:
Хабы:
+6
Комментарии 6
Комментарии Комментарии 6

Публикации

Истории

Работа

Go разработчик
124 вакансии

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн