Golang 编译打包-构建集成

摘要:
另一种是交叉编译。1.源代码编译需要在机器上安装相应的gosdk,然后可以在outdir文件中看到编译的二进制文件或exe文件。2.交叉编译是在编译到其他目标平台(如linux)之前进行的。

golang编译方式一般分为两种,一种是源码编译,另外一个是交叉编译

1.源码编译

这种方式需要在机器上安装相应的go sdk,可以参考环境部署相关的文章,这里不再叙述;我们只需要把项目代码copy到相应的机器上,然后再项目目录中,执行命令:go build ./main.go -o outdir,编译速度非常快,接着在outdir文件中即可看到编译后的二进制文件或exe文件

Golang 编译打包-构建集成第1张

2.交叉编译

在编译到linux等其他目标平台前,需要在机器上安装MingGW c++编译环境。更多信息请参考官网文档:https://github.com/golang/go/wiki#release-specific-information

GOOS:目标平台的操作系统(darwin、freebsd、linux、windows) 
GOARCH:目标平台的体系架构(386、amd64、arm) 
交叉编译不支持 CGO 所以要禁用它,如果要使用CGO,需要源码编译构建。

The valid combinations of GOOS and GOARCH are:

GOOS

GOARCH

aix

ppc64

android

386

android

amd64

android

arm

android

arm64

darwin

386

darwin

amd64

darwin

arm

darwin

arm64

dragonfly

amd64

freebsd

386

freebsd

amd64

freebsd

arm

illumos

amd64

js

wasm

linux

386

linux

amd64

linux

arm

linux

arm64

linux

ppc64

linux

ppc64le

linux

mips

linux

mipsle

linux

mips64

linux

mips64le

linux

s390x

netbsd

386

netbsd

amd64

netbsd

arm

openbsd

386

openbsd

amd64

openbsd

arm

openbsd

arm64

plan9

386

plan9

amd64

plan9

arm

solaris

amd64

windows

386

windows

amd64


2.1 Windows主机编译Linux,MAC客户端

Windows主机编译Windows客户端

SET CGO_ENABLED=0
SET GOOS=windows
SET GOARCH=amd64
go build -o abc-demo-windows.exe main.go

Windows主机编译LINUX客户端

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build -o abc-demo-linux main.go

Windows主机编译MAC客户端

SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build -o abc-demo-mac main.go

2.2 Linux主机编译Widows,MAC客户端

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o abc-demo-linux main.go
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o adc-demo-mac main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o abc-demo-windows.exe main.go

2.3 MAC主机编译Widows,linux客户端

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o abc-demo-linux main.go
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o abc-demo-mac main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o abc-demo-windows.exe main.go

这里以windows下编译linux amd64示例,直接编写一个bat脚本,然后双击执行

Golang 编译打包-构建集成第2张

编译比源码编译少慢了点,结果如下:

Golang 编译打包-构建集成第3张

可以看到成功的编译了一个二进制文件hai,该文件可以直接在目标平台上以 ./hai &的方式运行起来。

3.多平台一键打包

下面就来介绍一下打包神器 GoReleaser


goreleaser是一个自动化打包工具,解放双手,省去脚本编写,同时还支持对接CI/CD。
下面我们通过一个简单的例子来说明怎么使用 GoReleaser

3.1. 工具安装


下载安装 goreleaser (go get -u -v github.com/goreleaser/goreleaser
安装后执行 goreleaser -v 命令判断是否安装成功

Golang 编译打包-构建集成第4张

3.2. 创建demo工程


这次以hai项目为例,也可以自己新建一个hello world项目尝试

3.3. 初始化配置


然后在该项目根目录执行 goreleaser init ,将会生成一个.goreleaser.yml配置文件

打开文件
Golang 编译打包-构建集成第5张

3.4. 修改配置


默认配置文件需要稍作修改以满足我们的需求
我们的demo项目没有使用go generate,需要把 - go generate ./... 注释掉
添加我们需要的目标操作系统类型及架构
经过修改后的配置文件如下
Golang 编译打包-构建集成第6张

3.5. 打包

然后执行打包命令来验证是否打包成功
goreleaser --snapshot --skip-publish --rm-dist

Golang 编译打包-构建集成第7张

可以看到编译的情况及速度

Golang 编译打包-构建集成第8张
打包成功后将会在项目根目录/dist下生成各种不同平台的可执行文件

Golang 编译打包-构建集成第9张

3.6.配置文件说明

id:打包后目录前缀
goos:目标系统
goarch:目标CPU架构
snapshot.name_template:生成压缩包名称前缀
详细配置请参考官网
build配置: 编译配置
archives配置:打包配置
goos和goarch是乘积关系,至于为什么没有生成windows_arm64这样的可执行程序 是因为windows不能再arm上跑。
golang官网也列出了goos和goarch的兼容表。

免责声明:文章转载自《Golang 编译打包-构建集成》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【笔记】sublime 一些常用功能和快捷键pipenv下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Git提交代码报错husky > pre-commit

在接触了Git版本控制之后,很长一段时间里就只使用commit、pull、push这三个命令,并没有进行深究。而早上在用commit代码提交前端代码的时候出现了报错信息husky > pre-commit,于是开始查找背后的原因,最后通过阅读相关资料成功解决。 一、问题复现 我是通过IDEA编辑器中的Git工具进行提交代码,以往都是在勾选上需要提交的...

(转)简单的RPC java实现 .

转;http://blog.csdn.net/jackliang55/article/details/7580563  我也承认,RPC的名声大噪之时是在2003年,那一个“冲击波”病毒(Blaster Worm virus)袭卷全球的一年。而“冲击波”正是用着RPC这把刀来敲开了远程电脑的大门。当然RPC 有更多正面的应用,比如NFS、Web Serv...

离线更新VSAN HCL数据库

从VSAN 6.0起,VSAN提供了Health Check功能,其中就包括VSAN HCL数据库,通过此运行状况检查验证用于 HCL 检查的 VMware 兼容性指南数据库是否是最新的。这些 VCG 检查并非根据 VMware 网站上的 HCL 执行,而是根据存储在 vCenter Server 上的副本执行。运行状况功能的初始版本随发布当时最新的 HC...

记CentOs服务器内存使用满的解决办法

使用的一个应用服务器,weblogic部署,nginx分配,在使用了半个月的时间里,服务器内存达到杀掉服务器进程之后查看被删除但是仍然被应用程序占用的文件列表由于我删掉了日志里所以东西,所以导致后来我又得使用了一个命令由于我删了日志里的ngnix.pid 但是我删除的只是结尾log日志呀,不知道怎么就把pid结尾文件删除了,奇怪反正就报这个错“/usr/l...

python3降级为python2(linux)

在Linux上,使用python,有时候需要python2,有时候需要python3,下面简单介绍下将python3换成python2的方法。 1.查看Python目前的版本 直接输入 python 1 可以查看Python版本 2.将/usr/bin目录下的python版本切换 mv /usr/bin/python /usr/bin/python3....

LevelDB原理解析

LevelDb有如下一些特点: 首先,LevelDb是一个持久化存储的KV系统,和Redis这种内存型的KV系统不同,LevelDb不会像Redis一样狂吃内存,而是将大部分数据存储到磁盘上。 其次,LevleDb在存储数据时,是根据记录的key值有序存储的,就是说相邻的key值在存储文件中是依次顺序存储的,而应用可以自定义key大小比较函数,LevleD...