【導(dǎo)讀】本文是一篇 Go 項(xiàng)目的 Makefile 指南。
本文章的主題是: 編寫適用于 Go 項(xiàng)目的 Makefile 指南。
1. 前提:
- 會(huì)使用 Makefile
- 會(huì)使用 Go 編寫項(xiàng)目
編寫項(xiàng)目的過程中,經(jīng)常需要對文件進(jìn)行編譯和執(zhí)行,查看功能開發(fā)或者修復(fù)的 Bug 是否正確。你當(dāng)然可以直接執(zhí)行 go build
命令用來編譯,執(zhí)行 go run
命令來執(zhí)行。
在編寫 Go 項(xiàng)目其實(shí)還會(huì)經(jīng)常執(zhí)行些諸如 測試、格式檢查、庫下載安裝等命令。
當(dāng)然你也可以編寫 shell 腳本來執(zhí)行這些命令,進(jìn)一步進(jìn)行了簡化。
其實(shí)有更好的選擇,即 Makefile。在諸多的開源項(xiàng)目中經(jīng)常能看到 Makefile 的身影。當(dāng)你的項(xiàng)目中文件發(fā)生變化,都可以使用 Makefile 執(zhí)行命令來自動(dòng)構(gòu)建
2. Makefile 語法
PROJECT="example"
default:
echo${PROJECT}
install:
@govendorsync-v
test:install
@gotest./...
.PHONY:defaultinstalltest
上文是一個(gè)非常簡單的 Makefile 文件,通過這些命令的編寫,直接執(zhí)行 make
, make install
, make test
等就能完成對應(yīng)的命令。
格式介紹:
:
[tab]
- target : 即自定義的想要執(zhí)行的命令
- prerequisites: 前置條件,即執(zhí)行 target 命令之前執(zhí)行的命令
- commands : 具體的執(zhí)行的命令
- .PHONY 偽指令,內(nèi)置的關(guān)鍵字
- 不帶參數(shù),默認(rèn)執(zhí)行第一個(gè) target
- @ 表示禁止回聲,即終端不會(huì)打印真實(shí)的執(zhí)行命令
-
#
表示注釋 - ${val} 表示變量,和 shell 腳本中的變量的聲明和使用一致
- 允許使用 通配符
3. Go 項(xiàng)目
Go 中支持內(nèi)置的 go
命令,可以用來執(zhí)行:測試、編譯、運(yùn)行、語法檢查等命令
一個(gè)完善的 Go 項(xiàng)目經(jīng)常會(huì)執(zhí)行哪些命令?
- go vet 靜態(tài)檢查
- go test 運(yùn)行單元測試
- go fmt 格式化
- go build 編譯
- go run 運(yùn)行...
所以一個(gè)適用于 Go 項(xiàng)目的 Makefile 也應(yīng)該支持這些命令。
- make default : 編譯
- make fmt: 格式化
- make vet: 靜態(tài)檢查
- make test: 運(yùn)行測試
- make install: 下載依賴庫
- make clean: 移除編譯的二進(jìn)制文件
所以整體可以如下安排:
BINARY="example"
VERSION=1.0.0
BUILD=`date+%FT%T%z`
PACKAGES=`golist./...|grep-v/vendor/`
VETPACKAGES=`golist./...|grep-v/vendor/|grep-v/examples/`
GOFILES=`find.-name"*.go"-typef-not-path"./vendor/*"`
default:
@gobuild-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"Pleaserun'makefmt'andcommittheresult:";
echo"$${diff}";
exit1;
fi;
install:
@govendorsync-v
test:
@gotest-cpu=1,2,4-v-tagsintegration./...
vet:
@govet$(VETPACKAGES)
docker:
@dockerbuild-twuxiaoxiaoshen/example:latest.
clean:
@if[-f${BINARY}];thenrm${BINARY};fi
.PHONY:defaultfmtfmt-checkinstalltestvetdockerclean
4. 補(bǔ)充
Makefile 構(gòu)建工具,大大的簡化了構(gòu)建項(xiàng)目的難度。
真實(shí)的生產(chǎn)環(huán)境下,需要使用到CI/CD(持續(xù)集成和持續(xù)部署), 所以 Makefile 也通常用來和 CI 工具配合使用。
比如新合并的代碼,先觸發(fā)單元測試,靜態(tài)檢查等,在執(zhí)行 CI 腳本,成功之后,再構(gòu)建鏡像,推送鏡像到服務(wù)器上,完成持續(xù)集成和持續(xù)部署一整套流程。
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:
-gotest-cpu=1,2,4-v-tagsintegration./...
-govet$(golist./...|grep-v/vendor/)
script:
-makefmt
-makefmt-check
-makevet
-makelist
-gotest-race./...-coverprofile=coverage.txt-covermode=atomic
希望對大家有所啟發(fā)。
原文標(biāo)題:適用于 Go 項(xiàng)目的 Makefile 指南
文章出處:【微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
編寫
+關(guān)注
關(guān)注
0文章
29瀏覽量
8593 -
Makefile
+關(guān)注
關(guān)注
1文章
125瀏覽量
19649 -
BUG
+關(guān)注
關(guān)注
0文章
156瀏覽量
15984
原文標(biāo)題:適用于 Go 項(xiàng)目的 Makefile 指南
文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
linux系統(tǒng)中Makefile的使用方法
說說適用于單片機(jī)的接口適配器模式的實(shí)現(xiàn)
使用go實(shí)現(xiàn)一個(gè)適用于嵌入式上的存儲(chǔ)模塊
makefile文件的編寫方式
適用于所有atmega328p項(xiàng)目的通用板
USB標(biāo)準(zhǔn)適用于哪些應(yīng)用
如何寫Makefile編譯匯編和C文件

Makefile的項(xiàng)目模板免費(fèi)下載

Go項(xiàng)目中引入中間件的目的和效果如何
適用于MCU項(xiàng)目的代碼框架BabyOS

交叉編譯鏈下的Makefile(STM32F4xx)

適用于所有atmega328p項(xiàng)目的通用板

適用于ArduiNOOBS的MAX7219 LED矩陣模塊項(xiàng)目

Go開源13周年 2022發(fā)布更多改變的Go 1.18 和 Go 1.19版本
適用于Windows 10 IoT Core的Adafruit入門包創(chuàng)建開源項(xiàng)目

評論