当前位置:网站首页>go使用makefile脚本编译应用
go使用makefile脚本编译应用
2022-07-31 13:05:00 【CK持续成长】
目录
1. go介绍
Go官方 提供一个名为go的命令,该命令可以用来下载go的依赖,构建安装go应用,运行和测试 Go程序等等, 我们比较常用的比如go get, go mod, go run , go test等等。
但是,我们在 Go 项目中为了简化使用 go 命令的复杂性,规范团队使用 go 命令的方式,提升个人或团队的生产力,我们会使用makefile脚本,使用make来处理一些任务。
2. make及makefile
makefile可以看作是make工具的脚本文件, 而make主要用来处理一系列命令。常用的比如用来编译和打包文件, 在C/C++的编译打包中应用最广泛了。
makefile文件结构其实也比较简单:
target ... : prerequisites ...
command
...
...- target
可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。对于标签这种特性,在后续的“伪目标”章节中会有叙述。
- prerequisites
生成该target所依赖的文件和/或target
- command
该target要执行的命令(任意的shell命令)
makefile文件主要定义了执行目标应用, 它依赖哪些文件或者目标, 以及当前目标需要执行的command指令。有依赖项,他会先去执行依赖项的command。
具体的学习可以参考: makefile介绍 — 跟我一起写Makefile 1.0 文档
3. 使用makefile编译打包go应用
这里我们使用makefile来简单实现一个将go应用变异打包为不同系统的应用的示例:
.PHONY: all run clean help
APP = task
## linux: 编译打包linux
.PHONY: linux
linux:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build $(RACE) -o ./bin/${APP}-linux64 ./main.go
## win: 编译打包win
.PHONY: win
win:
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build $(RACE) -o ./bin/${APP}-win64.exe ./main.go
## mac: 编译打包mac
.PHONY: mac
mac:
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build $(RACE) -o ./bin/${APP}-darwin64 ./main.go
build:
@go build -o ${APP}
## 编译win,linux,mac平台
.PHONY: all
all:win linux mac
run:
@go run ./
.PHONY: tidy
tidy:
@go mod tidy
## test: Run unit test.
.PHONY: test
test:
@$(MAKE) go.test
## 清理二进制文件
clean:
@if [ -f ./bin/${APP}-linux64 ] ; then rm ./bin/${APP}-linux64; fi
@if [ -f ./bin/${APP}-win64.exe ] ; then rm ./bin/${APP}-win64.exe; fi
@if [ -f ./bin/${APP}-darwin64 ] ; then rm ./bin/${APP}-darwin64; fi
help:
@echo "make - 格式化 Go 代码, 并编译生成二进制文件"
@echo "make mac - 编译 Go 代码, 生成mac的二进制文件"
@echo "make linux - 编译 Go 代码, 生成linux二进制文件"
@echo "make win - 编译 Go 代码, 生成windows二进制文件"
@echo "make tidy - 执行go mod tidy"
@echo "make run - 直接运行 Go 代码"
@echo "make clean - 移除编译的二进制文件"
@echo "make all - 编译多平台的二进制文件"4. 一些go项目的makefile参考
- kratos微服务框架makefile
项目地址: kratos/Makefile at main · go-kratos/kratos · GitHub
kratos应用使用makefile文件打包,它比我们示例多添加了go工具的环境配置部分,还有自动生成使用gen工具编译proto文件,我们可以根据实际项目需要添加。
- iam身份识别系统使用makefile
项目地址:
iam项目使用makefile更多,它分为一个入口的makefile文件,同时它引入了项目scripts目录下的多个功能的脚本,如下图。 它将每个功能部分干的事情分拆到不同脚本文件,这样更清晰。提供的功能也更清晰细致。

边栏推荐
- ASM外部冗余是否可以替换磁盘
- Selenium IDE for Selenium Automation Testing
- 硬盘分区,拓展C盘,不重装系统,不重装D盘软件的全教程。
- Using SQL Server FOR XML and FOR JSON syntax on other RDBMSs with jOOQ
- PyQt5 rapid development and actual combat 9.7 Automated testing of UI layer
- log4j2的使用
- ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法
- PHP Serialization: eval
- 阿里三面:MQ 消息丢失、重复、积压问题,怎么解决?
- EXCEL如何快速拆分合并单元格数据
猜你喜欢

365-day challenge LeetCode1000 questions - Day 044 Maximum element in the layer and level traversal

ECCV2022:在Transformer上进行递归,不增参数,计算量还少!

go中select语句

anaconda虚拟环境安装pytorch gpu版本

ECCV 2022 | 机器人的交互感知与物体操作

alert(1) (haozi.me)靶场练习

networkx绘制度分布

Google Chrome(谷歌浏览器)安装使用

操作符详解

Invalid bound statement (not found)出现的原因和解决方法
随机推荐
How IDEA runs web programs
Optimization of five data submission methods
Error EPERM operation not permitted, mkdir ‘Dsoftwarenodejsnode_cache_cacach两种解决办法
golang中使用泛型
Selenium IDE for Selenium Automation Testing
Istio微服务治理网格的全方面可视化监控(微服务架构展示、资源监控、流量监控、链路监控)
网络协议及相关技术详解
Productivity Tools and Plugins
模拟量差分和单端(iou计算方法)
What should I do if selenium is reversed?
关于我放弃考研这件事儿
AMBA APB学习记录(AMBA 2.0)
EXCEL如何快速拆分合并单元格数据
六石编程学:不论是哪个功能,你觉得再没用,会用的人都离不了,所以至少要做到99%
函数递归1.0
基于verilog的CRC校验(汇总)
Using SQL Server FOR XML and FOR JSON syntax on other RDBMSs with jOOQ
知名无人驾驶公司:文远知行内推
ECCV2022:在Transformer上进行递归,不增参数,计算量还少!
滑窗法切分数据