В какие форматы можно упаковать Go-приложение и как его распространять?

Ответ

Go-приложения компилируются в нативные исполняемые файлы, но для распространения и интеграции их можно упаковать несколькими способами.

1. Исполняемый файл (самый частый способ)

Это стандартный результат работы команды go build. Создается единый статически скомпонованный бинарный файл, который не требует внешних зависимостей (если не используется CGO).

# Сборка для текущей ОС и архитектуры
go build -o myapp

# Кросс-компиляция для Linux
GOOS=linux GOARCH=amd64 go build -o myapp-linux

2. Библиотеки для интеграции с другими языками

Go-код можно скомпилировать в виде библиотек для использования в C, C++, Python и других языках.

  • Статическая библиотека (.a):
    go build -buildmode=archive -o mylib.a
  • **Динамическая (разделяемая) библиотека (.so, .dll):
    go build -buildmode=c-shared -o mylib.so

3. Docker-образ

Это стандарт де-факто для развертывания бэкенд-сервисов. Используется многоэтапная сборка для создания минимального и безопасного образа.

# Этап 1: Сборка приложения
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
# Собираем статически скомпонованный бинарник без CGO
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o myapp .

# Этап 2: Создание минимального образа для запуска
FROM alpine:latest
WORKDIR /root/
# Копируем только исполняемый файл из сборщика
COPY --from=builder /app/myapp .
CMD ["./myapp"]

4. Архивы (.zip, .tar.gz)

Простой способ распространения, когда нужно передать исполняемый файл вместе с конфигурационными файлами или другими ассетами.

tar -czvf myapp-v1.0.tar.gz myapp config.yaml

5. Go-плагины (.so)

Специальный режим сборки, который позволяет основной Go-программе динамически загружать и использовать функциональность из других Go-пакетов во время выполнения. Используется редко, в основном для создания расширяемых систем.

go build -buildmode=plugin -o myplugin.so