温馨提示×

golang编译ubuntu包有哪些步骤

小樊
35
2025-11-24 19:11:40
栏目: 编程语言

在 Ubuntu 上为 Go 程序制作可分发包(DEB)

一 准备环境与构建二进制

  • 安装 Go(两种常用方式)
    • 发行版仓库安装:sudo apt update && sudo apt install golang
    • 官方压缩包安装:wget https://golang.google.cn/dl/go1.22.0.linux-amd64.tar.gz && sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
  • 配置环境变量(写入 ~/.bashrc 或 /etc/profile 后执行 source)
    • export PATH=$PATH:/usr/local/go/bin
    • export GOROOT=/usr/local/go
    • export GOPATH=$HOME/go
    • export GOPROXY=https://goproxy.cn,direct
    • export GO111MODULE=on
  • 构建静态可执行文件(推荐,便于在不同 Ubuntu 版本运行)
    • CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags ‘-s -w’ -o myapp .
  • 可选优化
    • 压缩体积:sudo apt-get install upx && upx --best myapp
    • 交叉编译示例
      • Windows 64 位:GOOS=windows GOARCH=amd64 go build -o myapp.exe .
      • Linux ARM64:GOOS=linux GOARCH=arm64 go build -o myapp .
      • Linux ARMv7(需交叉编译器):CC=arm-linux-gnueabihf-gcc GOARCH=arm GOARM=7 GOOS=linux go build

二 制作 DEB 包的最小目录结构与控制文件

  • 建议目录结构
    • myapp-1.0.0/
      • DEBIAN/
        • control
        • postinst(可选)
        • prerm(可选)
      • usr/
        • local/
          • bin/
            • myapp
      • etc/
        • default/
          • myapp(可选,默认配置)
  • 关键文件示例
    • DEBIAN/control(示例字段,按实际替换)
      • Package: myapp
      • Version: 1.0.0
      • Section: utils
      • Priority: optional
      • Architecture: amd64
      • Maintainer: Your Name you@example.com
      • Description: A simple Go application
    • DEBIAN/postinst(可选,安装后执行,示例创建 systemd 服务)
      • #!/bin/sh set -e if [ “$1” = “configure” ]; then systemctl daemon-reload || true systemctl enable myapp.service || true systemctl start myapp.service || true fi
    • DEBIAN/prerm(可选,卸载前执行)
      • #!/bin/sh set -e if [ “$1” = “remove” ]; then systemctl stop myapp.service || true systemctl disable myapp.service || true fi
    • 可执行文件与权限
      • 将二进制放入:myapp-1.0.0/usr/local/bin/myapp
      • 设置权限:chmod 0755 myapp-1.0.0/usr/local/bin/myapp
      • 脚本权限:chmod 0755 myapp-1.0.0/DEBIAN/{postinst,prerm}
  • 构建命令
    • fakeroot dpkg-deb --build myapp-1.0.0
    • 生成的包:myapp-1.0.0.deb
  • 校验与安装
    • 校验:dpkg-deb -I myapp-1.0.0.deb(查看包信息),dpkg-deb -c myapp-1.0.0.deb(查看内容)
    • 安装:sudo dpkg -i myapp-1.0.0.deb
    • 卸载:sudo dpkg -r myapp

三 可选 使用容器进行干净构建

  • 使用官方 Go 镜像多阶段构建,产出静态二进制,再在构建机按第二节打包为 DEB,避免宿主机依赖干扰
    • Dockerfile 示例
      • FROM golang:1.22 AS builder WORKDIR /app COPY . . RUN go mod download RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags ‘-s -w’ -o myapp .
      • FROM ubuntu:22.04 RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && rm -rf /var/lib/apt/lists/* COPY --from=builder /app/myapp /usr/local/bin/myapp

        此处可按第二节准备 DEBIAN/ 目录并打包

    • 构建镜像:docker build -t myapp:build .
    • 从容器复制二进制:docker run --rm myapp:build cat /usr/local/bin/myapp > myapp

四 常见注意事项

  • 架构匹配:构建机的 GOARCH 与 DEBIAN/control 中的 Architecture 保持一致(如 amd64、arm64、armhf)。
  • CGO 与依赖:若程序需调用 C 库,需启用 CGO 并配置交叉编译器;否则使用 CGO_ENABLED=0 生成静态二进制,减少依赖问题。
  • systemd 服务:如提供 myapp.service,确保安装后执行 systemctl daemon-reload,并在 postinst 中处理 enable/start,在 prerm 中处理 stop/disable。
  • 文件归属与权限:/usr、/etc 等系统目录由 root 拥有,使用 fakeroot 构建可避免权限问题;可执行文件一般 0755,配置文件 0644。
  • 版本与升级:更新 Version 字段后重新打包;升级时关注 conffile 与 systemd 服务的平滑切换。

0