Всем привет! Когда я начинал писать на 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
Что хотелось в первую очередь:
-
Не хочу запоминать названия библиотек, хочу иметь для них синонимы.
-
Есть набор библиотек, которые ставятся сразу пачкой, бандлом — например fasthttp и роутер для него. Или gorm и его драйвер для PostgreSQL — такое хочется ставить одним синонимом.
-
Хочу указывать набор альясов в одной команде, пусть тащит их скопом. Например:
gost webserver gormpg prometheus cli
. -
Конфигурировать хочу в YAML.
-
Не буду ничего велосипедить, моя задача вызывать
go get
. -
Хочу иметь настройки по умолчанию, вшитые в бинарник.
-
Для тестирования и отладки хочу иметь режим 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. Да, утилиту я сделал давно и давно ей пользуюсь. Только сейчас донес ее до сообщества. Готов к доработкам по запросам коллег.
ссылка на оригинал статьи https://habr.com/ru/post/713482/
Добавить комментарий