jinzh notes
jinzh notes

Go交叉编译以及替代方案

Go交叉编译以及替代方案
内容纲要

交叉编译

交叉编译:在一个平台上编译生成可在另一个平台上运行的二进制文件

golang本身支持交叉编译,由环境变量控制生成目标二进制可执行文件

使用go env即可查看当前的环境变量!

#目标系统,Win:windows、linux:linux、Mac:darwin
set GOOS=windows
#目标架构
set GOARCH=amd64

当前版本不需要开启CGO_ENABLED选项,这是用来进行cgo交叉编译,但是cgo交叉编译由于依赖的c库在不同系统不一样,导致开启无用(网络上方法目前还未找到有效解决这个问题的方法)

如果标准库中是在CGO_ENABLED=1情况下编译的,那么编译出来的最终二进制文件可能是动态链接,所以建议设置 CGO_ENABLED=0以避免移植过程中出现的不必要问题

这也就意味着,如果使用了cgo,那么就与交叉编译无缘了

替代方案

本地使用虚拟机方式进行编译,这里只记录windows下方案!

通过使用WSL实现linux虚拟机进行程序的编译,来实现cgo程序的编译,按照官方教程开启WSL功能,并安装linux发行版,此处使用的是Debian

安装完成后推荐进行换源操作,国内访问源速度太慢!

安装所需的gcc编译环境

apt update
apt install -y gcc

本地安装golang,这里使用studygolang的资源

wget https://studygolang.com/dl/golang/go1.16.4.linux-amd64.tar.gz

rm -rf /usr/local/go
tar -C /usr/local -xzf go1.16.4.linux-amd64.tar.gz

sh -c "echo 'export PATH=\$PATH:/usr/local/go/bin' >> /etc/profile"

source /etc/profile
#让环境变量生效

安装完成后可以使用go version命令来检查是否生效

配置七牛云golang代理加速:

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

为了方便可以选择将windows的目录软连接到wsl内方便的目录,WSL的/mnt/c/Users就是windows用户目录的映射

ln -s 源路径 目标路径
#软连接方法
unlink 路径
#解除软连接方法

然后就是正常的进行构建目标程序

使用docker

2022/2/16
这几天去了解了一下docker,以前只知道这东西跑容器的,怎么用具体怎么跑都不清楚。。。。

docker是基于linux系统虚拟的,因此无法直接从windows上虚拟,需要使用windwos的wsl功能,也就是微软发布的linux子系统功能

简单记录一下怎么创建一个用来打包构建go的镜像的Dockerfile文件

FROM golang:latest
#这里默认使用的是基于debian的golang环境
MAINTAINER author <jinzhongjia@qq.com>

#RUN apk update && apk add gcc && apk add g++
#这行用来在golang:alpine上构建程序安装所需的c环境,sqlite数据要用到

ENV GOBIN=$GOPATH/bin
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,direct
ENV TZ=Asia/Shanghai

WORKDIR $GOPATH/src/app

ENTRYPOINT ["go", "build"]

构建镜像:

docker build -t gobuilder:latest .

运行容器开始打包程序,结束后删除容器:

docker run --rm -it -v D:\test\IM-BE:/go/src/app gobuilder:latest -ldflags="-s -w"

将宿主机的目录映射到容器中进行打包。。。。。

2022/4/6

解决多文件构建问题

适用场景:

一个项目下有多个文件需要构建,例如微服务情况

FROM golang:latest

LABEL stage=gobuilder

ENV GOPROXY=https://goproxy.cn,direct
ENV TZ=Asia/Shanghai

RUN apt update -y \
    && apt install upx -y

WORKDIR /build

ENTRYPOINT ["./build-linux.sh"]

原理是采用容器执行时,会运行挂载到容器内部文件的build-linux.sh文件,这里面可以存放需要打包的文件的命令,属于是通用包装镜像
构建出一个gobuilder镜像,其中自带upx,并且设置了时区,构建镜像:

docker build -t gobuilder:latest .

然后运行镜像开始构建

#这里不需要参数i,不需要进行输入,t是为了可以将upx打包的具体输出展示出来
docker run --rm -t -v g:\project\go:/build gobuilder:latest

影翼

文章作者

发表评论

textsms
account_circle
email

jinzh notes

Go交叉编译以及替代方案
交叉编译 交叉编译:在一个平台上编译生成可在另一个平台上运行的二进制文件 golang本身支持交叉编译,由环境变量控制生成目标二进制可执行文件 使用go env即可查看当前的环境变量! #…
扫描二维码继续阅读
2022-02-08