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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Всем привет! Когда я начинал писать на 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. Да, утилиту я сделал давно и давно ей пользуюсь. Только сейчас донес ее до сообщества. Готов к доработкам по запросам коллег.

Источник: https://habr.com/ru/post/713482/


Интересные статьи

Интересные статьи

Ни для кого не секрет, что сейчас игровая индустрия штампует только те виды игр, которые гарантированно пользуются спросом. Время идет вперед. Мир меняется. Технологии развиваются. Некоторые жанры ост...
Тестирование — один из процессов, который может быть автоматизирован в рамках CI/CD. Надёжное и тщательное автоматизированное тестирование позволяет быть уверенным в новых сборках, снижает затраты на ...
Как я оптимизировал аналитику используя структуры данных. Что в итоге сэкономило $22 000
Мы продолжаем нашу непримиримую борьбу со злостными нарушителями конфиденциальности пользователей. Наш браузер и на ПК, и на Андроиде теперь включает в себя следующие меры защиты: Какие? Рейтинг 0 ...
Сейчас на хайпе тема DevOps. Конвейер непрерывной интеграции и доставки CI/CD внедряют все, кому не лень. Но большинство не всегда уделяют должное внимание обеспечению надежности работы информаци...