不少時候, 咱們須要運行多個命令來能完成一件事, 又或者某個命令須要指定不少參數.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