Makefile構(gòu)建Golang項(xiàng)目示例詳解
背景
構(gòu)建和測試大型項(xiàng)目時(shí)都會很耗時(shí),且容易出錯(cuò)。開發(fā)者在開發(fā)過程中需要不斷執(zhí)行g(shù)o build、go run 、go test等相關(guān)命令。還可能需要多個(gè)命令來構(gòu)建不同平臺的二進(jìn)制文件。在正式部署時(shí)候,我們可能還需要安裝一些依賴項(xiàng),或者在發(fā)布之前進(jìn)行代碼覆蓋率測試等相關(guān)前置工作。
整個(gè)過程需要很多步驟,但我們有一種簡單的方法可以解決這些復(fù)雜瑣碎的步驟。使用 Make 進(jìn)行自動(dòng)執(zhí)行任務(wù)。它通過單個(gè)命令簡化開發(fā)并自動(dòng)執(zhí)行重復(fù)性任務(wù)。
Make 可以幫我們做很多事情:測試、構(gòu)建、清理、安裝 Go 項(xiàng)目。
創(chuàng)建項(xiàng)目并運(yùn)行
首先我們先創(chuàng)建一個(gè)簡單的項(xiàng)目,創(chuàng)建一個(gè) main.go 文件。為了運(yùn)行項(xiàng)目,我們需要構(gòu)建項(xiàng)目并運(yùn)行二進(jìn)制文件:
go build main.go
當(dāng)我們創(chuàng)建 Go 項(xiàng)目然后會遇到需要不同的二進(jìn)制名稱并且需要在特定的操作系統(tǒng)中創(chuàng)建構(gòu)建,那么可以通過指定環(huán)境進(jìn)行構(gòu)建:
# 指定 macos系統(tǒng) GOARCH=amd64 GOOS=darwin go build -o hello-darwin main.go # 指定 Linux 操作系統(tǒng) GOARCH=amd64 GOOS=linux go build -o hello-linux main.go go run hello
如果在開發(fā)部署過程中,我們不僅要記住這些命令然后遇到不同環(huán)境輸入命令執(zhí)行。在這個(gè)過程中你可能會發(fā)生輸錯(cuò)命令等行為。
使用 Makefile 可以協(xié)助我們高效工作,因?yàn)樗梢詭椭覀兒喕鲜雒?,甚至可以為特定命令指定?guī)則并運(yùn)行簡單的 make 命令,這樣不僅可以讓你免去記住這些命令和環(huán)境的關(guān)系。
添加 Makefile 文件
在當(dāng)前項(xiàng)目的根目錄下創(chuàng)建一個(gè) Makefile 文件,設(shè)置內(nèi)容如下:
BINARY_NAME=hello
build:
GOARCH=amd64 GOOS=darwin go build -o hello-darwin main.go
GOARCH=amd64 GOOS=linux go build -o hello-linux main.go
run:
./${BINARY_NAME}
build_and_run:build run
clean:
go clean
rm ${BINARY_NAME}-darwin
rm ${BINARY_NAME}-linux
創(chuàng)建完 Makefile 文件后,就可以通過這些簡單的命令進(jìn)行編譯和運(yùn)行你的 Go 項(xiàng)目:
make run make build # 也可以使用在 makefile 中定義的一個(gè)命令:build_and_run make build_and_run # 使用清除命令清除二進(jìn)制文件 make clean
以上命令相對于一開始的命令更簡單,使用簡單,也可以避免因輸出命令導(dǎo)致的相關(guān)錯(cuò)誤。
Makefile
概念
make 命令都是來源于 Makefile 文件的。其都是由一系列的規(guī)則構(gòu)成。每條規(guī)則都是由目標(biāo)、依賴項(xiàng)、命令組成。
- 目標(biāo) Target:make 命令通過目標(biāo)名稱執(zhí)行具體命令。如上的 make run
- 依賴項(xiàng) Dependencies:目標(biāo)可以具有需要在運(yùn)行目標(biāo)之前執(zhí)行的依賴項(xiàng)
- 配方 recipe:運(yùn)行目標(biāo)時(shí)將執(zhí)行的實(shí)際命令
變量
Makefiles 也有使用變量的機(jī)制。在以上的 Makefile 文件中,可以看到 ${BINARY_NAME} 的變量。所以當(dāng)我們有相同的內(nèi)容時(shí)可以通過添加變量進(jìn)行替換。
可以使用 = 或 := 定義變量。
= 將遞歸擴(kuò)展變量。 這將替換它被替換時(shí)的值。以下例子在運(yùn)行 all 命令時(shí),它會將 x 的值替換為最后更新的值。因此將打印:later bar。 例如:
x = foo y = $(x) bar x = later all: echo $(y)
但是當(dāng)你使用 := 進(jìn)行變量賦值時(shí),將打印第一次的值,比如:
x := foo y := $(x) bar x := later all: echo $(y) > foo bar
更多使用 makefile 命令,可以參考:makefiletutorial.com/
使用 Makefile 自動(dòng)化任務(wù)
在開發(fā)項(xiàng)目時(shí),可以將一些測試,運(yùn)行測試覆蓋,管理依賴等工作,我們都可以創(chuàng)建一個(gè) Makefile ,并在文件中包含自動(dòng)化這些任務(wù)的所有規(guī)則:
BINARY_NAME=hello
build:
GOARCH=amd64 GOOS=linux go build -o ${BINARY_NAME}-linux main.go
run:
./${BINARY_NAME}
build_and_run: build run
clean:
go clean
rm ${BINARY_NAME}-linux
test:
go test ./...
test_coverage:
go test ./... -coverprofile=coverage.out
dep:
go mod download
vet:
go vet
lint:
golangci-lint run --enable-all
使用這個(gè)簡單的 Makefile,您現(xiàn)在可以輕松地執(zhí)行命令來運(yùn)行任務(wù)。這樣就輕松自動(dòng)化解決工作。
make test make test_coverage make dep make vet make lint
參考資料:
http://www.fzitv.net/article/256709.htm
以上就是Makefile構(gòu)建Golang項(xiàng)目示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Makefile構(gòu)建Golang的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang使用Decimal庫避免運(yùn)算中精度損失詳細(xì)步驟
decimal是為了解決Golang中浮點(diǎn)數(shù)計(jì)算時(shí)精度丟失問題而生的一個(gè)庫,使用decimal庫我們可以避免在go中使用浮點(diǎn)數(shù)出現(xiàn)精度丟失的問題,下面這篇文章主要給大家介紹了關(guān)于Golang使用Decimal庫避免運(yùn)算中精度損失的相關(guān)資料,需要的朋友可以參考下2023-06-06
golang獲取變量或?qū)ο箢愋偷膸追N方式總結(jié)
在golang中并沒有提供內(nèi)置函數(shù)來獲取變量的類型,但是通過一定的方式也可以獲取,下面這篇文章主要給大家介紹了關(guān)于golang獲取變量或?qū)ο箢愋偷膸追N方式,需要的朋友可以參考下2022-12-12
Golang標(biāo)準(zhǔn)庫os/exec執(zhí)行外部命令并獲取其輸出包代碼示例
這篇文章主要為大家介紹了Golang標(biāo)準(zhǔn)庫os/exec執(zhí)行外部命令并獲取其輸出包代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

