使用Golang 1.14模块化和Golang 1.11非模块化编译同一项目的对比

使用Golang 1.14模块化和Golang 1.11非模块化编译同一项目的对比 大家好,

我们一直在使用模块构建一个大型的Go语言项目。 我们需要支持Windows XP(我知道这在2020年非常奇怪,但我们的一位客户仍有数百台XP设备在使用)。

你们会如何自动化Go 1.11的构建以支持32位Windows XP?

我们目前使用Go版本go1.14.3进行构建。 同时我们也使用go-mobile进行构建。

#!/usr/bin/env bash

# 发行版的相对路径。
DISTRIB_PATH=distributions

for mainGoPath in tplst tplsth/tplsth
do
# 使用路径的最后一个组成部分来确定可执行文件的名称
executableName=${mainGoPath##*/};

# 为我们选定的目标平台构建
# 要列出可支持的目标平台:"go tool dist list"

echo "为mac/darwin 64构建 ${executableName}"
env GOOS=darwin GOARCH=amd64 go build -o ${DISTRIB_PATH}/mac/${executableName} ${mainGoPath}.go
echo "为windows 32构建 ${executableName}"
env GOOS=windows GOARCH=386 go build -o ${DISTRIB_PATH}/win32/${executableName}.exe ${mainGoPath}.go
echo "为windows 64构建 ${executableName}"
env GOOS=windows GOARCH=amd64 go build -o ${DISTRIB_PATH}/win64/${executableName}.exe ${mainGoPath}.go
echo "为Linux 32构建 ${executableName}"
env GOOS=linux GOARCH=386 go build -o ${DISTRIB_PATH}/linux32/${executableName} ${mainGoPath}.go
echo "为Linux 64构建 ${executableName}"
env GOOS=linux GOARCH=amd64 go build -o ${DISTRIB_PATH}/linux64/${executableName} ${mainGoPath}.go
echo "为Linux ARM7 32构建 ${executableName}"
env GOOS=linux GOARCH=arm GOARM=7 go build -o ${DISTRIB_PATH}/linuxArm7/${executableName} ${mainGoPath}.go
echo "为Linux ARM8 64构建 ${executableName}"
env GOOS=linux GOARCH=arm64 go build -o ${DISTRIB_PATH}/linuxArm8/${executableName} ${mainGoPath}.go
done

更多关于使用Golang 1.14模块化和Golang 1.11非模块化编译同一项目的对比的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于使用Golang 1.14模块化和Golang 1.11非模块化编译同一项目的对比的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


针对Windows XP的32位构建,关键是要使用Go 1.11并设置正确的环境变量。以下是自动化Go 1.11构建的示例:

#!/usr/bin/env bash

# 设置Go 1.11路径
GO111=/path/to/go1.11/bin/go
DISTRIB_PATH=distributions

for mainGoPath in tplst tplsth/tplsth
do
    executableName=${mainGoPath##*/};
    
    # Windows XP 32位构建
    echo "为Windows XP 32位构建 ${executableName}"
    env GOOS=windows GOARCH=386 \
        CGO_ENABLED=0 \
        GO111MODULE=off \
        $GO111 build \
        -ldflags="-s -w -H=windowsgui" \
        -o ${DISTRIB_PATH}/winxp32/${executableName}.exe \
        ${mainGoPath}.go
    
    # 同时保留Go 1.14的模块化构建
    echo "为Windows 64位构建 ${executableName} (Go 1.14)"
    env GOOS=windows GOARCH=amd64 \
        go build \
        -o ${DISTRIB_PATH}/win64/${executableName}.exe \
        ${mainGoPath}.go
done

关键配置说明:

  1. CGO_ENABLED=0:禁用CGO,避免依赖系统库
  2. GO111MODULE=off:强制关闭模块模式
  3. -ldflags参数
    • -s:省略符号表
    • -w:省略DWARF调试信息
    • -H=windowsgui:隐藏控制台窗口(如果是GUI应用)

对于go-mobile构建,需要单独处理:

# 使用Go 1.11构建移动端
export PATH=/path/to/go1.11/bin:$PATH
export GO111MODULE=off

# Android构建
gomobile build -target=android/386 -o app.apk

# iOS构建
gomobile build -target=ios -o app.ipa

如果项目依赖需要vendor目录,可以使用Go 1.11的vendor模式:

# 生成vendor目录
$GO111 mod vendor

# 使用vendor构建
$GO111 build -mod=vendor -o output.exe main.go

对于持续集成环境,可以创建Docker镜像来隔离不同Go版本:

# Dockerfile.go1.11
FROM golang:1.11-alpine
RUN apk add --no-cache gcc musl-dev
WORKDIR /app
COPY . .
RUN GOOS=windows GOARCH=386 CGO_ENABLED=0 go build -o app-xp.exe main.go

这样可以在同一项目中同时维护Go 1.11的非模块化构建和Go 1.14的模块化构建。

回到顶部