你們好,我叫謝偉,是一名使用 Go 語言的後端開發者。html
本文章的主題是: 編寫適用於 Go 項目的 Makefile 指南。docker
編寫項目的過程當中,常常須要對文件進行編譯和執行,查看功能開發或者修復的 Bug 是否正確。你固然能夠直接執行 go build
命令用來編譯,執行 go run
shell
命令來執行。json
在編寫 Go 項目其實還會常常執行些諸如 測試、格式檢查、庫下載安裝等命令。後端
固然你也能夠編寫 shell 腳原本執行這些命令,進一步進行了簡化。bash
其實有更好的選擇,即 Makefile。 在諸多的開源項目中常常能看到 Makefile 的身影。當你的項目中文件發生變化,均可以使用 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>
複製代碼
#
表示註釋Go 中支持內置的 go
命令,能夠用來執行:測試、編譯、運行、語法檢查等命令測試
一個完善的 Go 項目常常會執行哪些命令?
因此一個適用於 Go 項目的 Makefile 也應該支持這些命令。
因此總體能夠以下安排:
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
複製代碼
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
複製代碼
但願對你們有所啓發。
<完>
參考: