Всем привет! Когда я начинал писать на 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. Да, утилиту я сделал давно и давно ей пользуюсь. Только сейчас донес ее до сообщества. Готов к доработкам по запросам коллег.
Комментарии (6)
manyakRus
31.01.2023 13:12а зачем вам каждый раз делать модуль gorm, драйвер для PostgreSQL,
prometheus и др.
Делаешь 1 раз модуль gorm_connect и используешь его много раз -
даже копировать файл не надо, он итак лежит в хранилище git
paramtamtam
Для однотипных проектов давно придуман boilerplate, но придумать проблему и мужественно ее решить - тоже отдельный вид искусства, согласен (извиняюсь за токсичность)
satmaelstorm Автор
Видимо весьма зря я статью начал с использования именно для старта нового проекта. Вобщем-то основная проблема была в другом. Вот мне посреди разработки проекта понадобился lru. Я помню, что у меня где-то используется его достойная реализация. Ок, поискав, я найду что это github.com/hashicorp/golang-lru
Но я совершенно не могу помнить как он пишется (или как пишется, например, github.com/valyala/fastjson). Мне нужен был инструмент - указал имя библиотеки -> она появилась в проекте (gost mod lru или go get github.com/hashicorp/golang-lru). Я сделал себе такой инструмент и, спустя время его использования, решил поделиться с сообществом.
А запуск на основе его проекта - это уже побочный эффект, оно ничего не стоило.
DimNS
Ну даже не знаю, все достойные пакеты я помечаю на гитхабе звездами и в этом случае "вспоминать как я назвал алиас в конфиге gost" или "зайти на гитхаб в звезды и там найти либу", еще непонятно что быстрее, как бы не пришлось лезть в конфиг gost чтобы найти там нужный алиас
satmaelstorm Автор
Именно так я и делал. А потом копипастил url пакета в go get. И именно этот процесс хотелось ускорить. Мнемонические альясы оказались достаточно удобны. Касательно лезть в конфиг - помощь по команде выдает полный конфиг, по которому можно поискать. Пример:
gost mod --help | grep mongo