在Docker环境交叉编译Golang输出Windows可执行程序

适用范围

本文适用于日常开发工作在macOS Linux环境下,但是需要输出Windows 32或64位可执行程序的同学阅读。

当然也适用于其他需要交叉编译的场景。

阅读本文前,请先熟悉 Docker环境的安装和基本命名。

下文使用 YOURAPP 指代您需要交叉编译的开发中的项目。

环境准备

  1. 安装 Docker
  2. 下载Docker镜像 docker pull golang:1.12
  3. 掌握几个Shell命令

    • 设置环境变量 export MYNAME=AAA
    • 输出环境变量 echo $MYNAME
    • 确认本机正确设置了$GOPATH
    • 开发中的项目保存在$GOPATH/src/YOURAPP

执行步骤

  1. 在您的开发物理机比如macOS Linux确认开发中的Golang源代码可以编译通过
  2. 修改主文件,在main方法上面增加定义全局变量

    1
    2
    // 如下变量供编译器使用,不适用于golint的修改建议
    var _VERSION_ = "unknown"
  3. 下载并启动最新版本容器,当前版本是 golang:1.12 假定您开发物理机的项目在$GOPATH/src/YOURAPP

    1
    docker run --rm -it -v "$GOPATH":/usr/src/myapp -w /usr/src/myapp/src/YOURAPP -e GOOS=windows -e GOARCH=386 -e GOPATH=/usr/src/myapp -e GO15VENDOREXPERIMENT=1 golang:1.12 bash
  4. 定义带时间戳的版本号

    1
    export VERSION=`date -d today +v2.4.0.%-Y%-m%-d%-k%M%S

    查看定义的版本号

    1
    echo $VERSION

    示例结果: v2.4.0.201941924900

  5. 在运行的Docker容器中设置环境变量,可能需要执行这一步

    1
    export GO111MODULE=on
  6. 同时打包运行在Windows环境下的32位版本和64位版本exe可执行程序

    1
    for GOOS in windows;do for GOARCH in 386 amd64; do go build -v -ldflags "-s -w -X main._VERSION_="$VERSION -o YOURAPP-$GOOS-$GOARCH-$VERSION.exe; done; done

    解释说明

    上述编译打包命令中把在操作系统环境变量中定义的 $VERSION注入到主文件中即修改全局变量_VERSION_

    $VERSION –> _VERSION_

    编译输出的可执行文件名称包含

    • YOURAPP 程序名称
    • $GOOS 目标操作系统
    • $GOARCH 架构
    • $VERSION 带时间错的版本号

示例:

1
2
YOURAPP-windows-386-v2.4.0.201941924900.exe
YOURAPP-windows-amd64-v2.4.0.201941924900.exe