【關(guān)注公眾號(hào)】「syd3600520」 回復(fù)002 獲取Go相關(guān)學(xué)習(xí)資料
這篇文章打算跟大家聊聊Makefiles,作為一個(gè)后端開發(fā)者砚哗,熟練掌握Makefiles咖啡可以多喝幾口海渊。書歸正傳
golang內(nèi)置了很多 go commands 可以幫助我們完成go每個(gè)階段的開發(fā)工作,但是很多時(shí)候我們需要分享我們的代碼給其他人,初次看到我們代碼工程的人可能并不知道怎么讓它跑起來挣饥。當(dāng)然你也可以通過README.md
或者其他方式來告知讀者蓖捶。
但對(duì)于那些只想快速構(gòu)建程序的人來說地回,使用Makefile很好得抽象了技術(shù)細(xì)節(jié),當(dāng)我們看到Makefile文件時(shí)自然能想到使用make或者make install來構(gòu)建程序俊鱼。從此告別記憶長(zhǎng)串的命令瘋狂敲鍵盤 偶爾還會(huì)敲錯(cuò)的尷尬場(chǎng)景??
比如:
go build -o hello hello.go
./hello
使用Makefile刻像,我們可以很輕松自定義一個(gè)target完成這個(gè)任務(wù)
.PHONY: buildandrun
BIN_FILE=hello
buildandrun:
@go build -o "${BIN_FILE}" hello.go
./"${BIN_FILE}"
然后我們就可以用如下命令完成工作了
make
./"hello"
hello world
我們真正上線構(gòu)建編譯時(shí)的命令可能是這樣的 :
go install -tags="${BUILD_TAGS}" -ldflags "-X version.version=$(VERSION) -X version.date=$(DATE) -X version.commit=$(COMMIT) -X version.branch=$(BRANCH) -w -s" -gcflags=all="-N -l " ./...
裝配上Makefile贮乳,我們僅僅敲4個(gè)字符 make
即可梳庆,我們開發(fā)過程中惰爬,不同階段需要干不同的事兒喊积,
- 清理編譯中間目標(biāo)文件
- 跑測(cè)試case
- 檢查測(cè)試覆蓋率
- 執(zhí)行代碼檢查 等等
Makefile的goal機(jī)制對(duì)這種情況進(jìn)行了很好的抽象梢夯,以下是我工作當(dāng)中的Makefile的配置痕寓,雖然不是很復(fù)雜但真的很有用清酥。
.PHONY: all build clean run check cover lint docker help
BIN_FILE=hello
all: check build
build:
@go build -o "${BIN_FILE}"
clean:
go clean
rm --force "xx.out"
test:
go test
check:
go fmt ./
go vet ./
cover:
go test -coverprofile xx.out
go tool cover -html=xx.out
run:
./"${BIN_FILE}"
lint:
golangci-lint run --enable-all
docker:
@docker build -t leo/hello:latest .
help:
@echo "make 格式化go代碼 并編譯生成二進(jìn)制文件"
@echo "make build 編譯go代碼生成二進(jìn)制文件"
@echo "make clean 清理中間目標(biāo)文件"
@echo "make test 執(zhí)行測(cè)試case"
@echo "make check 格式化go代碼"
@echo "make cover 檢查測(cè)試覆蓋率"
@echo "make run 直接運(yùn)行程序"
@echo "make lint 執(zhí)行代碼檢查"
@echo "make docker 構(gòu)建docker鏡像"
總結(jié)
使用Makefile來管理我們程序的構(gòu)建讶踪,減少了大量輸入购公、拼寫錯(cuò)誤萌京,簡(jiǎn)化構(gòu)建項(xiàng)目的難度。真實(shí)線上環(huán)境配合CI/CD更佳宏浩,如果你還沒有嘗試使用Makefile知残,那真的可以試試。
【關(guān)注公眾號(hào)】「syd3600520」 回復(fù)002 獲取Go相關(guān)學(xué)習(xí)資料