Одна из сторон языка Go, за которую его многие любят, это простота. Она же является и его слабостью, выражающейся в увеличении количества кода вместе с повышением уровня абстракции.
Я хочу писать более абстрактный код там где это требуется, снимая ограничения системы типов если это необходимо. Для этого в серии статей буду искать такую реализацию скриптового языка, которую можно подружить с Go рантаймом и я точно знаю что хочу нечто lisp-подобное.
Зачем такой язык нужен:
- конфигурация: на скриптовом языке описывается конфигурация приложения
- инициализация: из кода на интерпретируемом языке происходит инициализация компонентов, написанных на языке компилируемом
- расширение: виртуальной машине интерпретируемого языка в некоторые моменты передаётся управление с целью увеличения гибкости
Раз в год (или около того) мне нужно запустить PostgreSQL с целью поразрабатывать что-нибудь. За то время что я его не использую знания выветриваются, так что на будущее я делаю эту заметку, в основном для себя.
Запускать PostgreSQL можно разными способами, вот два самых распространенных:
- использовать docker
- поставить пакет
Оба способа немного магические. Контейнеры стараются быть удобными и покрывать как можно больше функциональности, что выливается в адские entrypoint’ы на bash с обратным удобству эффектом. Пакеты в распространенных дистрибутивах тоже содержат не мало магии, ведь они обычно (как минимум) инициализируют директорию с данными СУБД и запускают её сервис.
В nixos тоже есть пакет для PostgreSQL, но он не управляет ни запуском, ни процессом инициализации. Так что полезно помнить как работать руками.
Многие сегодня используют docker для доставки своих решений в продакшен. Обычно образы собираются с помощью т.н. Dockerfile, который может иметь следующий вид:
FROM golang:latest as builder
WORKDIR /go/src
COPY . .
RUN go build -o app
FROM alpine:latest
COPY --from=builder /go/src/app /bin/app
CMD /bin/app
Можно ли сказать что образ, полученный в результате сборки с указанным Dockerfile, будет воспроизводимым?
Нет. Эта заметка объясняет:
- почему
- как писать
Dockerfile чтобы приблизиться к воспроизводимости
- чем заменить
Dockerfile чтобы сделать сборки воспроизводимыми
Некоторое время назад я начал переезжать с spacemacs обратно на самописную конфигурацию(мне так стабильнее и кастомайзить проще). Common LISP и scheme работают почти без настройки, а вот с golang пришлось поплясать.
Цель: настроить среду разработки, которая способна:
- к автокомплиту
- выводу документации
- go to definition
Это минимум, необходимый мне для работы.
Скажу сразу:
- не всё заработало
- некоторые вещи тормозят
- некоторые работают странно
Но жить можно, плюс ко всему - понятно что улучшать.