Ответ
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