Всем привет! Когда я начинал писать на 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)


  1. paramtamtam
    29.01.2023 11:54
    +4

    Для однотипных проектов давно придуман boilerplate, но придумать проблему и мужественно ее решить - тоже отдельный вид искусства, согласен (извиняюсь за токсичность)


    1. satmaelstorm Автор
      29.01.2023 20:59

      Видимо весьма зря я статью начал с использования именно для старта нового проекта. Вобщем-то основная проблема была в другом. Вот мне посреди разработки проекта понадобился lru. Я помню, что у меня где-то используется его достойная реализация. Ок, поискав, я найду что это github.com/hashicorp/golang-lru

      Но я совершенно не могу помнить как он пишется (или как пишется, например, github.com/valyala/fastjson). Мне нужен был инструмент - указал имя библиотеки -> она появилась в проекте (gost mod lru или go get github.com/hashicorp/golang-lru). Я сделал себе такой инструмент и, спустя время его использования, решил поделиться с сообществом.
      А запуск на основе его проекта - это уже побочный эффект, оно ничего не стоило.


      1. DimNS
        30.01.2023 05:51
        +1

        Ну даже не знаю, все достойные пакеты я помечаю на гитхабе звездами и в этом случае "вспоминать как я назвал алиас в конфиге gost" или "зайти на гитхаб в звезды и там найти либу", еще непонятно что быстрее, как бы не пришлось лезть в конфиг gost чтобы найти там нужный алиас


        1. satmaelstorm Автор
          30.01.2023 12:34
          -1

          Именно так я и делал. А потом копипастил url пакета в go get. И именно этот процесс хотелось ускорить. Мнемонические альясы оказались достаточно удобны. Касательно лезть в конфиг - помощь по команде выдает полный конфиг, по которому можно поискать. Пример: gost mod --help | grep mongo


  1. un1t
    29.01.2023 16:00
    +2

    В чем собственнно проблема скопировать go.mod?


  1. manyakRus
    31.01.2023 13:12

    а зачем вам каждый раз делать модуль gorm, драйвер для PostgreSQL, prometheus и др.

    Делаешь 1 раз модуль gorm_connect и используешь его много раз -
    даже копировать файл не надо, он итак лежит в хранилище git