Golang?Makefile示例深入講解使用
Makefile提供有效方式實(shí)現(xiàn)自動(dòng)化構(gòu)建任務(wù),與Java中的Maven類(lèi)似。Makefile主要應(yīng)用場(chǎng)景為使用目標(biāo)(標(biāo)簽)運(yùn)行不同任務(wù)。
需要提醒的是,make工具僅在unix環(huán)境上使用,如果是windows,需要安裝Linux環(huán)境依賴(lài)(如:mingw)執(zhí)行make命令。
從入門(mén)示例開(kāi)始
假設(shè)我們有一個(gè)main.go程序,構(gòu)建文件需要使用命令:
go build main.go
運(yùn)行程序使用命令為:
go build -o main.out main.go
./main.out
下面使用單個(gè)Makefile文件(文件命名為Makefile,首字母大寫(xiě),沒(méi)有擴(kuò)展名),內(nèi)容如下:
BINARY_NAME=main.out
build:
go build -o ${BINARY_NAME} main.go
run:
go build -o ${BINARY_NAME} main.go
./${BINARY_NAME}
clean:
go clean
rm ${BINARY_NAME}
現(xiàn)在可以運(yùn)行build 和 run 任務(wù):
make build
make run
如果需要增加缺省標(biāo)簽,可以使用all標(biāo)簽:
BINARY_NAME=main.out
## 缺省任務(wù),不要換行
all: build test
build:
go build -o ${BINARY_NAME} main.go
test:
go test -v main.go
run:
go build -o ${BINARY_NAME} main.go
./${BINARY_NAME}
clean:
go clean
rm ${BINARY_NAME}
這時(shí)直接運(yùn)行make命令,則執(zhí)行build test兩個(gè)任務(wù)。當(dāng)然我們還可以定義其他復(fù)雜任務(wù),假如項(xiàng)目有多個(gè)依賴(lài),需要通過(guò)go get package-name
命令安裝,我們可以定義deps目標(biāo),實(shí)現(xiàn)自動(dòng)安裝所有相關(guān)依賴(lài),舉例:
deps:
go get github.com/gorilla/websocket
運(yùn)行命令:make deps
則自動(dòng)安裝相關(guān)依賴(lài)。
makefile語(yǔ)法詳解
通過(guò)上面簡(jiǎn)單示例大概了解Makefile的用途,下面介紹其基本語(yǔ)法,首先介紹幾個(gè)術(shù)語(yǔ):目標(biāo)、依賴(lài)、任務(wù)以及變量。
- 目標(biāo)(Target): Targets 是Makefile中的主要組件. make命令通過(guò)目標(biāo)的名稱(chēng)執(zhí)行任務(wù)。上面示例中的 build, run, and build_and_clean稱(chēng)為目標(biāo),目標(biāo)是具體執(zhí)行具體任務(wù)的接口。
- 依賴(lài)(Dependencies): 目標(biāo)可以包括依賴(lài)任務(wù),在運(yùn)行當(dāng)前目標(biāo)之前執(zhí)行的目標(biāo)為依賴(lài)目標(biāo)。舉例,build_and_clean 有兩個(gè)依賴(lài): build run。 注意,依賴(lài)不要換行寫(xiě),和目標(biāo)在一行。
- 任務(wù)(Recipe): Recipe是運(yùn)行目標(biāo)時(shí)實(shí)際執(zhí)行的一條或多條命令。如果是多個(gè)命令,則每條命令需為單獨(dú)一行,且每條命令前使用tab進(jìn)行縮進(jìn),不是空格。
- 變量(Variables): 大多數(shù)腳本都支持變量,Makefile也支持變量,當(dāng)在不同目標(biāo)中使用相同配置時(shí),使用變量可以讓腳本更通用、以維護(hù)。定義變量使用等號(hào):
variable_name=hello-world
, 引用變量使用${variable_name}
變量舉例:
x = foo
y = $(x) bar
x = later
all:
echo $(y)
這里all為默認(rèn)目標(biāo),執(zhí)行make命令輸出結(jié)果:
echo later bar
later bar
再來(lái)一個(gè)完整示例
下面我們通過(guò)稍微復(fù)雜的示例來(lái)說(shuō)明Makefile的用法,go代碼很簡(jiǎn)單,但需要編譯不同平臺(tái)的可執(zhí)行文件。首先定義main.go文件:
package main import "fmt" func main() { fmt.Println("hello world") }
要運(yùn)行項(xiàng)目,正常需要構(gòu)建并運(yùn)行二進(jìn)制文件:
go build main.go
如果需要指定操作系統(tǒng)及輸出文件,下面是mac平臺(tái):
GOARCH=amd64 GOOS=darwin go build -o hello-world main.go
如果希望創(chuàng)建多個(gè)OS平臺(tái),需要運(yùn)行多次命令:
GOARCH=amd64 GOOS=darwin go build -o hello-world-darwin main.go
GOARCH=amd64 GOOS=linux go build -o hello-world-linux main.go
GOARCH=amd64 GOOS=window go build -o hello-world-windows main.go
上面命令可以使用Makefile,在項(xiàng)目根目錄下創(chuàng)建Makefile文件:
BINARY_NAME=hello-world
build:
GOARCH=amd64 GOOS=darwin go build -o ${BINARY_NAME}-darwin main.go
GOARCH=amd64 GOOS=linux go build -o ${BINARY_NAME}-linux main.go
GOARCH=amd64 GOOS=window go build -o ${BINARY_NAME}-windows main.go
run:
./${BINARY_NAME}
build_and_run: build run
clean:
go clean
rm ${BINARY_NAME}-darwin
rm ${BINARY_NAME}-linux
rm ${BINARY_NAME}-windows
現(xiàn)在可以簡(jiǎn)單運(yùn)行make命令:
make run
make build
也可以運(yùn)行組合命令:
make build_and_run
最后還可以運(yùn)行清理命令:
make clean
這些命令非常方便,有助于開(kāi)發(fā)過(guò)程流水線。開(kāi)發(fā)團(tuán)隊(duì)成員可以使用相同命令,減少操作不一致造成錯(cuò)誤,提升構(gòu)建效率。
下面擴(kuò)展上面的示例,增加一些自動(dòng)化任務(wù),包括測(cè)試、覆蓋率測(cè)試、代碼檢查以及管理依賴(lài)。具體內(nèi)容如下:
BINARY_NAME=hello-world
build:
GOARCH=amd64 GOOS=darwin go build -o ${BINARY_NAME}-darwin main.go
GOARCH=amd64 GOOS=linux go build -o ${BINARY_NAME}-linux main.go
GOARCH=amd64 GOOS=window go build -o ${BINARY_NAME}-windows main.go
run:
./${BINARY_NAME}
build_and_run: build run
clean:
go clean
rm ${BINARY_NAME}-darwin
rm ${BINARY_NAME}-linux
rm ${BINARY_NAME}-windows
test:
go test ./...
test_coverage:
go test ./... -coverprofile=coverage.out
dep:
go mod download
vet:
go vet
lint:
golangci-lint run --enable-all
現(xiàn)在可以簡(jiǎn)單執(zhí)行下列任務(wù):
make test
make test_coverage
make dep
make vet
make lint
注意:我們使用了外部包golangci-lint,需要使用 go mod ,確保在go.mod文件中增加相應(yīng)依賴(lài)。
總結(jié)
Golang是開(kāi)發(fā)大型項(xiàng)目的流行語(yǔ)言。較大的項(xiàng)目會(huì)有多人協(xié)作,并且需要持續(xù)的自動(dòng)化構(gòu)建。通過(guò)自動(dòng)化開(kāi)發(fā)、測(cè)試和發(fā)布等任務(wù)來(lái)簡(jiǎn)化構(gòu)建過(guò)程,會(huì)帶來(lái)更快、更可靠、更簡(jiǎn)單的開(kāi)發(fā)體驗(yàn)。
到此這篇關(guān)于Golang Makefile示例深入講解使用的文章就介紹到這了,更多相關(guān)Go Makefile內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang validator庫(kù)參數(shù)校驗(yàn)實(shí)用技巧干貨
這篇文章主要為大家介紹了validator庫(kù)參數(shù)校驗(yàn)實(shí)用技巧干貨,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04golang 實(shí)現(xiàn)時(shí)間滑動(dòng)窗口的示例代碼
滑動(dòng)時(shí)間窗口就是把一段時(shí)間片分為多個(gè)樣本窗口,可以通過(guò)更細(xì)粒度對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì),這篇文章主要介紹了golang 實(shí)現(xiàn)時(shí)間滑動(dòng)窗口,需要的朋友可以參考下2022-10-10基于Go語(yǔ)言實(shí)現(xiàn)類(lèi)似tree命令的小程序
tree?命令是一個(gè)小型的跨平臺(tái)命令行程序,用于遞歸地以樹(shù)狀格式列出或顯示目錄的內(nèi)容。本文將通過(guò)Go語(yǔ)言實(shí)現(xiàn)類(lèi)似tree命令的小程序,需要的可以參考一下2022-10-10Go 實(shí)現(xiàn)基于Token 的登錄流程深度分析
Token 認(rèn)證機(jī)制的核心思想是,服務(wù)端在用戶(hù)登錄時(shí)生成一個(gè) Token,客戶(hù)端在后續(xù)的請(qǐng)求中攜帶這個(gè) Token,服務(wù)端通過(guò)驗(yàn)證 Token 的有效性來(lái)確認(rèn)用戶(hù)的身份,本文將帶你深入探索基于 Token 的登錄流程,這是一種更為靈活且適用于現(xiàn)代應(yīng)用架構(gòu)的認(rèn)證方式2024-03-03GO語(yǔ)言類(lèi)型查詢(xún)類(lèi)型斷言示例解析
這篇文章主要為大家介紹了GO語(yǔ)言類(lèi)型判斷及類(lèi)型斷言,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04go的defer和閉包示例說(shuō)明(非內(nèi)部實(shí)現(xiàn))
這篇文章主要為大家介紹了go的defer和閉包示例說(shuō)明(非內(nèi)部實(shí)現(xiàn)),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08