使用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
关键配置说明:
- CGO_ENABLED=0:禁用CGO,避免依赖系统库
- GO111MODULE=off:强制关闭模块模式
- -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的模块化构建。

