Я хотел написать об этом шаблоне уже давно, потому что он использовался для моих #wow-проектов (groceries, debt, lately и secret на момент написания этой статьи).
Прежде всего, это шаблон Cookicutter, который позволяет мне стартовать новые проекты с минимальными усилиями. Я знаю, что некоторые предпочитают go gen
, когда работают в экосистеме Go, но поскольку я пришел из мира Python, я привык к Cookicutter. Честно говоря, Cookiecutter не зависит от языка и работает отлично.
Этот шаблон сгенерирует Go-проект, который структурирован в основном в соответствии с golang-standards/project-layout. Есть пакет cmd
, который использует urfave/cli. Одна из команд всегда server
, потому что этот шаблон предназначен для веб-приложений. Другие команды обычно создаются в соответствии с конкретными потребностями приложения. Это может быть импорт данных или бот.
Команда server
использует переменные окружения для настройки. В целом, я предпочитаю использовать переменные окружения как можно чаще. Я думал добавить умную конфигурацию, которая может загружаться из YAML, TOML, переменных среды и аргументов командной строки, но это было слишком сложной задачей для меня, и я решил придерживаться подхода с одним источником.
Говоря о задачах, я использую Taskfile вместо Makefile
, потому что мне нравится, как можно запустить сервер и сделать так, чтобы Taskfile следил за изменениями без установки дополнительных инструментов. Мне также нравится запускать процессы фронтенда и бэкенда параллельно, Taskfile позволяет это делать без проблем.
Я упомянул фронтенд, давайте поговорим о нем. Он находится в папке web
, которая представляет собой пакет Go, в который встраивается сгенерированный бандл. Я не беспокоюсь о коммите файлов бандла в репозиторий, и это облегчает мне жизнь при деплое.
Сам фронтенд сделан с помощью SolidJS с Solid Router, потому что мне нравится, что это в основном чистый TypeScript с небольшим количеством TSX. Никакого специального синтаксиса (как в Svelte), никаких странных тегов не по стандарту HTML5 (как className
в React), только базовые примитивы и очень интуитивно понятный для бэкенд-разработчиков вроде меня.
Фронтенд приложения оформлен с помощью TailwindCSS, так как я нахожу его очень простым в использовании и, опять же, довольно интуитивным. Возможно, в какой-то момент я перейду на UnoCSS, потому что он полностью совместим с TailwindCSS и использует меньше файлов для настройки.
Один из вариантов, к которому я склоняюсь, когда пробую что-то новое, - это HTMX. Я еще не придумал, как заставить мой Cookiecutter генерировать различные структуры файлов и папок по условию, так что, возможно, в будущем я создам отдельный вариант шаблона.
И последнее, но не менее важное: у меня есть базовая конфигурация для взаимодействия с Centrifugo. Раньше у меня был свой собственный WebSocket-сервер, основанный на olahol/melody, но я быстро понял, что мне нужно что-то более надежное с предопределенными механизмами аутентификации и способами передачи сообщений с использованием различных правил. В общем, я хотел что-то вроде SocketIO, который я по какой-то причине не использовал, но, возможно, попробую когда-нибудь в будущем, потому что есть googollee/go-socket.io, который, кажется, подходит для этого.
Если вы смогли дочитать до конца, я советую вам попробовать PocketBase, прежде чем рассматривать мой шаблон, потому что они в основном достигли того, что я пытался сделать, и превзошли меня в некоторых аспектах (например, красивый интерфейс администратора).