适用于 Go 项目的 Makefile 指南
↓推荐关注↓
【导读】本文是一篇 Go 项目的 Makefile 指南。
本文章的主题是: 编写适用于 Go 项目的 Makefile 指南。
1. 前提:
会使用 Makefile 会使用 Go 编写项目
编写项目的过程中,经常需要对文件进行编译和执行,查看功能开发或者修复的 Bug 是否正确。你当然可以直接执行 go build
命令用来编译,执行 go run
命令来执行。
在编写 Go 项目其实还会经常执行些诸如 测试、格式检查、库下载安装等命令。
当然你也可以编写 shell 脚本来执行这些命令,进一步进行了简化。
其实有更好的选择,即 Makefile。在诸多的开源项目中经常能看到 Makefile 的身影。当你的项目中文件发生变化,都可以使用 Makefile 执行命令来自动构建
2. Makefile 语法
PROJECT="example"
default:
echo ${PROJECT}
install:
@govendor sync -v
test: install
@go test ./...
.PHONY: default install test
上文是一个非常简单的 Makefile 文件,通过这些命令的编写,直接执行 make
, make install
, make test
等就能完成对应的命令。
格式介绍:
<target> : <prerequisites>
[tab] <commands>
target : 即自定义的想要执行的命令 prerequisites: 前置条件,即执行 target 命令之前执行的命令 commands : 具体的执行的命令 .PHONY 伪指令,内置的关键字 不带参数,默认执行第一个 target @ 表示禁止回声,即终端不会打印真实的执行命令 #
表示注释${val} 表示变量,和 shell 脚本中的变量的声明和使用一致 允许使用 通配符
3. Go 项目
Go 中支持内置的 go
命令,可以用来执行:测试、编译、运行、语法检查等命令
一个完善的 Go 项目经常会执行哪些命令?
go vet 静态检查 go test 运行单元测试 go fmt 格式化 go build 编译 go run 运行 ...
所以一个适用于 Go 项目的 Makefile 也应该支持这些命令。
make default : 编译 make fmt: 格式化 make vet: 静态检查 make test: 运行测试 make install: 下载依赖库 make clean: 移除编译的二进制文件
所以整体可以如下安排:
BINARY="example"
VERSION=1.0.0
BUILD=`date +%FT%T%z`
PACKAGES=`go list ./... | grep -v /vendor/`
VETPACKAGES=`go list ./... | grep -v /vendor/ | grep -v /examples/`
GOFILES=`find . -name "*.go" -type f -not -path "./vendor/*"`
default:
@go build -o ${BINARY} -tags=jsoniter
list:
@echo ${PACKAGES}
@echo ${VETPACKAGES}
@echo ${GOFILES}
fmt:
@gofmt -s -w ${GOFILES}
fmt-check:
@diff=?(gofmt -s -d $(GOFILES)); \
if [ -n "$$diff" ]; then \
echo "Please run 'make fmt' and commit the result:"; \
echo "$${diff}"; \
exit 1; \
fi;
install:
@govendor sync -v
test:
@go test -cpu=1,2,4 -v -tags integration ./...
vet:
@go vet $(VETPACKAGES)
docker:
@docker build -t wuxiaoxiaoshen/example:latest .
clean:
@if [ -f ${BINARY} ] ; then rm ${BINARY} ; fi
.PHONY: default fmt fmt-check install test vet docker clean
4. 补充
Makefile 构建工具,大大的简化了构建项目的难度。
真实的生产环境下,需要使用到CI/CD(持续集成和持续部署), 所以 Makefile 也通常用来和 CI 工具配合使用。
比如新合并的代码,先触发单元测试,静态检查等,在执行 CI 脚本,成功之后,再构建镜像,推送镜像到服务器上,完成持续集成和持续部署一整套流程。
Makefile 通常配合 travis 使用。
比如:
language: go
go:
- "1.11"
- "1.11.x"
env:
- GO111MODULE=on
notifications:
email:
recipients:
- wuxiaoshen@shu.edu.cn
on_success: change # default: change
on_failure: always # default: always
before_install:
- go test -cpu=1,2,4 -v -tags integration ./...
- go vet $(go list ./... | grep -v /vendor/)
script:
- make fmt
- make fmt-check
- make vet
- make list
- go test -race ./... -coverprofile=coverage.txt -covermode=atomic
希望对大家有所启发。
转自:
https://juejin.cn/post/6844903806971412494
- EOF -
看完本文有收获?请分享给更多人
推荐关注「Linux 爱好者」,提升Linux技能
点赞和在看就是最大的支持❤️