go使用makefile腳本編譯應(yīng)用的方法小結(jié)
1. go介紹
Go官方 提供一個(gè)名為go的命令,該命令可以用來(lái)下載go的依賴,構(gòu)建安裝go應(yīng)用,運(yùn)行和測(cè)試 Go程序等等, 我們比較常用的比如go get, go mod, go run , go test等等。
但是,我們?cè)?Go 項(xiàng)目中為了簡(jiǎn)化使用 go 命令的復(fù)雜性,規(guī)范團(tuán)隊(duì)使用 go 命令的方式,提升個(gè)人或團(tuán)隊(duì)的生產(chǎn)力,我們會(huì)使用makefile腳本,使用make來(lái)處理一些任務(wù)。
2. make及makefile
makefile可以看作是make工具的腳本文件, 而make主要用來(lái)處理一系列命令。常用的比如用來(lái)編譯和打包文件, 在C/C++的編譯打包中應(yīng)用最廣泛了。
makefile文件結(jié)構(gòu)其實(shí)也比較簡(jiǎn)單:
target ... : prerequisites ...
command
...
...target
可以是一個(gè)object file(目標(biāo)文件),也可以是一個(gè)執(zhí)行文件,還可以是一個(gè)標(biāo)簽(label)。對(duì)于標(biāo)簽這種特性,在后續(xù)的“偽目標(biāo)”章節(jié)中會(huì)有敘述。
prerequisites
生成該target所依賴的文件和/或target
command
該target要執(zhí)行的命令(任意的shell命令)
makefile文件主要定義了執(zhí)行目標(biāo)應(yīng)用, 它依賴哪些文件或者目標(biāo), 以及當(dāng)前目標(biāo)需要執(zhí)行的command指令。有依賴項(xiàng),他會(huì)先去執(zhí)行依賴項(xiàng)的command。
具體的學(xué)習(xí)可以參考:makefile介紹 — 跟我一起寫Makefile 1.0 文檔
3. 使用makefile編譯打包go應(yīng)用
這里我們使用makefile來(lái)簡(jiǎn)單實(shí)現(xiàn)一個(gè)將go應(yīng)用變異打包為不同系統(tǒng)的應(yīng)用的示例:
.PHONY: all run clean help
APP = task
## linux: 編譯打包linux
.PHONY: linux
linux:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build $(RACE) -o ./bin/${APP}-linux64 ./main.go
## win: 編譯打包win
.PHONY: win
win:
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build $(RACE) -o ./bin/${APP}-win64.exe ./main.go
## mac: 編譯打包mac
.PHONY: mac
mac:
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build $(RACE) -o ./bin/${APP}-darwin64 ./main.go
build:
@go build -o ${APP}
## 編譯win,linux,mac平臺(tái)
.PHONY: all
all:win linux mac
run:
@go run ./
.PHONY: tidy
tidy:
@go mod tidy
## test: Run unit test.
.PHONY: test
test:
@$(MAKE) go.test
## 清理二進(jìn)制文件
clean:
@if [ -f ./bin/${APP}-linux64 ] ; then rm ./bin/${APP}-linux64; fi
@if [ -f ./bin/${APP}-win64.exe ] ; then rm ./bin/${APP}-win64.exe; fi
@if [ -f ./bin/${APP}-darwin64 ] ; then rm ./bin/${APP}-darwin64; fi
help:
@echo "make - 格式化 Go 代碼, 并編譯生成二進(jìn)制文件"
@echo "make mac - 編譯 Go 代碼, 生成mac的二進(jìn)制文件"
@echo "make linux - 編譯 Go 代碼, 生成linux二進(jìn)制文件"
@echo "make win - 編譯 Go 代碼, 生成windows二進(jìn)制文件"
@echo "make tidy - 執(zhí)行g(shù)o mod tidy"
@echo "make run - 直接運(yùn)行 Go 代碼"
@echo "make clean - 移除編譯的二進(jìn)制文件"
@echo "make all - 編譯多平臺(tái)的二進(jìn)制文件"4. 一些go項(xiàng)目的makefile參考 kratos微服務(wù)框架makefile
項(xiàng)目地址:kratos/Makefile at main · go-kratos/kratos · GitHub
kratos應(yīng)用使用makefile文件打包,它比我們示例多添加了go工具的環(huán)境配置部分,還有自動(dòng)生成使用gen工具編譯proto文件,我們可以根據(jù)實(shí)際項(xiàng)目需要添加。
iam身份識(shí)別系統(tǒng)使用makefile
項(xiàng)目地址:
iam項(xiàng)目使用makefile更多,它分為一個(gè)入口的makefile文件,同時(shí)它引入了項(xiàng)目scripts目錄下的多個(gè)功能的腳本,如下圖。 它將每個(gè)功能部分干的事情分拆到不同腳本文件,這樣更清晰。提供的功能也更清晰細(xì)致。

到此這篇關(guān)于go使用makefile腳本編譯應(yīng)用的文章就介紹到這了,更多相關(guān)gomakefile編譯應(yīng)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang根據(jù)job數(shù)量動(dòng)態(tài)控制每秒?yún)f(xié)程的最大創(chuàng)建數(shù)量方法詳解
這篇文章主要介紹了Golang根據(jù)job數(shù)量動(dòng)態(tài)控制每秒?yún)f(xié)程的最大創(chuàng)建數(shù)量方法2024-01-01
Golang中map的三種聲明定義方式實(shí)現(xiàn)
本文主要介紹了Golang中map的三種聲明定義方式實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
深入理解Golang?Channel?的底層結(jié)構(gòu)
這篇文章主要介紹了深入理解Golang?Channel?的底層結(jié)構(gòu),Go?語(yǔ)言的?channel?底層是什么數(shù)據(jù)結(jié)構(gòu)?下面我們就一起來(lái)深入解析一下?channel,需要的朋友可以參考下2022-01-01
一文帶你搞懂Golang依賴注入的設(shè)計(jì)與實(shí)現(xiàn)
在現(xiàn)代的 web 框架里面,基本都有實(shí)現(xiàn)了依賴注入的功能,可以讓我們很方便地對(duì)應(yīng)用的依賴進(jìn)行管理。今天我們來(lái)看看 go 里面實(shí)現(xiàn)依賴注入的一種方式,感興趣的可以了解一下2023-01-01
go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易比特幣系統(tǒng)錢包的原理解析
這篇文章主要介紹了go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易比特幣系統(tǒng)錢包的原理解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
golang的httpserver優(yōu)雅重啟方法詳解
這篇文章主要給大家介紹了關(guān)于golang的httpserver優(yōu)雅重啟的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
goland?-sync/atomic原子操作小結(jié)
這篇文章主要介紹了goland?-sync/atomic原子操作,原子操作能夠保證執(zhí)行期間是連續(xù)且不會(huì)被中斷(變量不會(huì)被其他修改,mutex可能存在被其他修改的情況),本文給大家介紹的非常詳細(xì),需要的朋友參考下2022-08-08
golang協(xié)程池模擬實(shí)現(xiàn)群發(fā)郵件功能
這篇文章主要介紹了golang協(xié)程池模擬實(shí)現(xiàn)群發(fā)郵件功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
go項(xiàng)目實(shí)現(xiàn)mysql接入及web?api的操作方法
這篇文章主要介紹了go項(xiàng)目實(shí)現(xiàn)mysql接入以及web api,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08

