> ~ biozz / Проекты

cookiecutter-biozz-project 2024-02-22

A template for the #wow projects

https://github.com/biozz/cookiecutter-biozz-project

Я хотел написать об этом шаблоне уже давно, потому что он использовался для моих #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, прежде чем рассматривать мой шаблон, потому что они в основном достигли того, что я пытался сделать, и превзошли меня в некоторых аспектах (например, красивый интерфейс администратора).

#dev #wow #go #solidjs