網(wǎng)站首頁 編程語言 正文
Makefile提供有效方式實現(xiàn)自動化構建任務,與Java中的Maven類似。Makefile主要應用場景為使用目標(標簽)運行不同任務。
需要提醒的是,make工具僅在unix環(huán)境上使用,如果是windows,需要安裝Linux環(huán)境依賴(如:mingw)執(zhí)行make命令。
從入門示例開始
假設我們有一個main.go程序,構建文件需要使用命令:
go build main.go
運行程序使用命令為:
go build -o main.out main.go
./main.out
下面使用單個Makefile文件(文件命名為Makefile,首字母大寫,沒有擴展名),內(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)在可以運行build 和 run 任務:
make build
make run
如果需要增加缺省標簽,可以使用all標簽:
BINARY_NAME=main.out
## 缺省任務,不要換行
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}
這時直接運行make命令,則執(zhí)行build test兩個任務。當然我們還可以定義其他復雜任務,假如項目有多個依賴,需要通過go get package-name
命令安裝,我們可以定義deps目標,實現(xiàn)自動安裝所有相關依賴,舉例:
deps:
? ? go get github.com/gorilla/websocket
運行命令:make deps
則自動安裝相關依賴。
makefile語法詳解
通過上面簡單示例大概了解Makefile的用途,下面介紹其基本語法,首先介紹幾個術語:目標、依賴、任務以及變量。
- 目標(Target): Targets 是Makefile中的主要組件. make命令通過目標的名稱執(zhí)行任務。上面示例中的 build, run, and build_and_clean稱為目標,目標是具體執(zhí)行具體任務的接口。
- 依賴(Dependencies): 目標可以包括依賴任務,在運行當前目標之前執(zhí)行的目標為依賴目標。舉例,build_and_clean 有兩個依賴: build run。 注意,依賴不要換行寫,和目標在一行。
- 任務(Recipe): Recipe是運行目標時實際執(zhí)行的一條或多條命令。如果是多個命令,則每條命令需為單獨一行,且每條命令前使用tab進行縮進,不是空格。
- 變量(Variables): 大多數(shù)腳本都支持變量,Makefile也支持變量,當在不同目標中使用相同配置時,使用變量可以讓腳本更通用、以維護。定義變量使用等號:
variable_name=hello-world
, 引用變量使用${variable_name}
變量舉例:
x = foo
y = $(x) bar
x = later
all:
? ? echo $(y)
這里all為默認目標,執(zhí)行make命令輸出結果:
echo later bar
later bar
再來一個完整示例
下面我們通過稍微復雜的示例來說明Makefile的用法,go代碼很簡單,但需要編譯不同平臺的可執(zhí)行文件。首先定義main.go文件:
package main import "fmt" func main() { fmt.Println("hello world") }
要運行項目,正常需要構建并運行二進制文件:
go build main.go
如果需要指定操作系統(tǒng)及輸出文件,下面是mac平臺:
GOARCH=amd64 GOOS=darwin go build -o hello-world main.go
如果希望創(chuàng)建多個OS平臺,需要運行多次命令:
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,在項目根目錄下創(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)在可以簡單運行make命令:
make run
make build
也可以運行組合命令:
make build_and_run
最后還可以運行清理命令:
make clean
這些命令非常方便,有助于開發(fā)過程流水線。開發(fā)團隊成員可以使用相同命令,減少操作不一致造成錯誤,提升構建效率。
下面擴展上面的示例,增加一些自動化任務,包括測試、覆蓋率測試、代碼檢查以及管理依賴。具體內(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)在可以簡單執(zhí)行下列任務:
make test
make test_coverage
make dep
make vet
make lint
注意:我們使用了外部包golangci-lint,需要使用 go mod ,確保在go.mod文件中增加相應依賴。
總結
Golang是開發(fā)大型項目的流行語言。較大的項目會有多人協(xié)作,并且需要持續(xù)的自動化構建。通過自動化開發(fā)、測試和發(fā)布等任務來簡化構建過程,會帶來更快、更可靠、更簡單的開發(fā)體驗。
原文鏈接:https://blog.csdn.net/neweastsun/article/details/128555366
相關推薦
- 2022-12-22 數(shù)據(jù)清洗之如何用一行Python代碼去掉文本中的各種符號_python
- 2024-03-14 docker導出導入鏡像或容器
- 2022-10-26 Android?audio音頻流數(shù)據(jù)異常問題解決分析_Android
- 2022-08-02 python3線程池ThreadPoolExecutor處理csv文件數(shù)據(jù)_python
- 2023-09-18 子組件向父組件傳值的4種方法
- 2022-11-01 Kotlin語言使用BroadcastReceiver示例介紹_Android
- 2022-04-11 C++中引用和const關鍵字介紹_C 語言
- 2022-04-22 golang數(shù)據(jù)類型【字符類型】以及fmt的輸出輸入、UTF-8 和 Unicode 有何區(qū)別?
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支