不少时候, 咱们须要运行多个命令来能完成一件事, 又或者某个命令须要指定不少参数.html
这个时候, 就须要使用脚原本取代这些复杂的命令, 减小输错命令的可能, 也能够为后来者指明经常使用的操做.node
Makefile 就是为此而生的, 相对于用途普遍的 shell 脚本, Makefile 专一于构建自动化过程, 一般用于编译源码等. 不少项目都会提供 Makefile 文件, 只须要简单地运行 make
就能轻松完成编译构建的过程.mysql
简单介绍下 Makefile 的规则.linux
target: dependencies
system command(s)
复制代码
target 一般是程序要生成的目标文件的名字. 但也能够是一个动做的名字.git
dependencies 是依赖, 一般是文件, 完成 target 所须要的输入.github
system command(s) 是完成 target 所须要运行的指令, 即 shell 命令. 一条语句一行, 使用单个 tab 缩进.web
使用 make 命令能够运行各类 target. 若是不带 target 参数, 第一个 target 会被做为默认目标.sql
不少时候, Makefile 不是为了编译, 也再也不引用任何文件, 仅仅是为了整合多个命令, 比写脚本方便多. 这个时候涉及到一个叫作伪目标的指令 .PHONY
. .PHONY
后面跟着的多个 target 都不是要生成的文件的名字, 而是指代一个动做, 一个行为. 好比 test 指运行测试, clean 清理文件等.docker
.PHONY: all test clean doc ci
复制代码
更多内容能够参考 跟我一块儿写 Makefileshell
注意, windows 下没有 make 命令, 因此 Makefile 也就没法使用.
你能够在 docker 容器中运行命令, 能够参考另外一篇文章 在 VS Code 中使用容器开发
.
在项目的根目录添加 Makefile
文件:
all: gotool build
build:
@go build ./
run:
@go run ./
clean:
rm -f web
find . -name "[._]*.s[a-w][a-z]" | xargs -i rm -f {}
gotool:
go fmt ./
go vet ./
ca:
MSYS_NO_PATHCONV=1 openssl req -new -nodes -x509 -out conf/server.crt -keyout conf/server.key -days 3650 -subj "/C=CN/ST=SH/L=SH/O=CoolCat/OU=CoolCat Software/CN=127.0.0.1/emailAddress=coolcat@qq.com"
mysql:
docker-compose up -d mysql
dbcli:
docker-compose run --rm dbclient
help:
@echo "make - 格式化 Go 代码, 并编译生成二进制文件"
@echo "make build - 编译 Go 代码, 生成二进制文件"
@echo "make run - 直接运行 Go 代码"
@echo "make clean - 移除二进制文件和 vim swap files"
@echo "make gotool - 运行 Go 工具 'fmt' and 'vet'"
@echo "make ca - 生成证书文件"
@echo "make mysql - 启动 mysql 服务器"
@echo "make dbcli - 链接到 mysql 命令行"
.PHONY: all build run clean gotool ca mysql dbcli help
复制代码
这里的全部 target 都是伪目标.用来包装一些简单的 shell 命令.
能够在项目根目录下运行如下命令:
有了 Makefile 的帮助, 不少事情变得简单起来了, 好比要生成证书文件, 只须要运行 make ca
就好了, 不用输入一大行命令了.
Makefile 是 linux 下经常使用的工具, 对于提高效率是很是有效的.
做为版本 v0.11.0