欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang?Makefile示例深入講解使用

 更新時間:2023年01月12日 10:35:53   作者:夢想畫家  
一次偶然的機會,在?github?上看到有人用?Makefile,就嘗試了一下,發(fā)現(xiàn)真的非常合適,Makefile?本身就是用來描述依賴的,可讀性非常好,而且與強大的?shell?結(jié)合在一起,基本可以實現(xiàn)任何想要的功能

Makefile提供有效方式實現(xiàn)自動化構(gòu)建任務(wù),與Java中的Maven類似。Makefile主要應(yīng)用場景為使用目標(biāo)(標(biāo)簽)運行不同任務(wù)。

需要提醒的是,make工具僅在unix環(huán)境上使用,如果是windows,需要安裝Linux環(huán)境依賴(如:mingw)執(zhí)行make命令。

從入門示例開始

假設(shè)我們有一個main.go程序,構(gòu)建文件需要使用命令:

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 任務(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}

這時直接運行make命令,則執(zhí)行build test兩個任務(wù)。當(dāng)然我們還可以定義其他復(fù)雜任務(wù),假如項目有多個依賴,需要通過go get package-name 命令安裝,我們可以定義deps目標(biāo),實現(xiàn)自動安裝所有相關(guān)依賴,舉例:

deps:
    go get github.com/gorilla/websocket

運行命令:make deps 則自動安裝相關(guān)依賴。

makefile語法詳解

通過上面簡單示例大概了解Makefile的用途,下面介紹其基本語法,首先介紹幾個術(shù)語:目標(biāo)、依賴、任務(wù)以及變量。

  • 目標(biāo)(Target): Targets 是Makefile中的主要組件. make命令通過目標(biāo)的名稱執(zhí)行任務(wù)。上面示例中的 build, run, and build_and_clean稱為目標(biāo),目標(biāo)是具體執(zhí)行具體任務(wù)的接口。
  • 依賴(Dependencies): 目標(biāo)可以包括依賴任務(wù),在運行當(dāng)前目標(biāo)之前執(zhí)行的目標(biāo)為依賴目標(biāo)。舉例,build_and_clean 有兩個依賴: build run。 注意,依賴不要換行寫,和目標(biāo)在一行。
  • 任務(wù)(Recipe): Recipe是運行目標(biāo)時實際執(zhí)行的一條或多條命令。如果是多個命令,則每條命令需為單獨一行,且每條命令前使用tab進行縮進,不是空格。
  • 變量(Variables): 大多數(shù)腳本都支持變量,Makefile也支持變量,當(dāng)在不同目標(biā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

再來一個完整示例

下面我們通過稍微復(fù)雜的示例來說明Makefile的用法,go代碼很簡單,但需要編譯不同平臺的可執(zhí)行文件。首先定義main.go文件:

package main
import "fmt"
func main() {
 fmt.Println("hello world")
}

要運行項目,正常需要構(gòu)建并運行二進制文件:

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ā)團隊成員可以使用相同命令,減少操作不一致造成錯誤,提升構(gòu)建效率。

下面擴展上面的示例,增加一些自動化任務(wù),包括測試、覆蓋率測試、代碼檢查以及管理依賴。具體內(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í)行下列任務(wù):

make test
make test_coverage
make dep
make vet
make lint

注意:我們使用了外部包golangci-lint,需要使用 go mod ,確保在go.mod文件中增加相應(yīng)依賴。

總結(jié)

Golang是開發(fā)大型項目的流行語言。較大的項目會有多人協(xié)作,并且需要持續(xù)的自動化構(gòu)建。通過自動化開發(fā)、測試和發(fā)布等任務(wù)來簡化構(gòu)建過程,會帶來更快、更可靠、更簡單的開發(fā)體驗。

到此這篇關(guān)于Golang Makefile示例深入講解使用的文章就介紹到這了,更多相關(guān)Go Makefile內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang validator庫參數(shù)校驗實用技巧干貨

    golang validator庫參數(shù)校驗實用技巧干貨

    這篇文章主要為大家介紹了validator庫參數(shù)校驗實用技巧干貨,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Go使用sync.Pool提高性能的代碼示例

    Go使用sync.Pool提高性能的代碼示例

    在高性能應(yīng)用程序中,頻繁的內(nèi)存分配和回收是性能瓶頸的常見原因之一,Go 語言提供了 sync.Pool 類型,它可以用來存儲和重用臨時對象,本文將詳細介紹如何在 Go 中使用 sync.Pool,并通過實際代碼示例來展示其對性能的提升效果,需要的朋友可以參考下
    2024-04-04
  • go如何刪除字符串中的部分字符

    go如何刪除字符串中的部分字符

    這篇文章主要介紹了go刪除字符串中的部分字符操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • golang 實現(xiàn)時間滑動窗口的示例代碼

    golang 實現(xiàn)時間滑動窗口的示例代碼

    滑動時間窗口就是把一段時間片分為多個樣本窗口,可以通過更細粒度對數(shù)據(jù)進行統(tǒng)計,這篇文章主要介紹了golang 實現(xiàn)時間滑動窗口,需要的朋友可以參考下
    2022-10-10
  • Go語言中的反射原理解析與應(yīng)用

    Go語言中的反射原理解析與應(yīng)用

    反射(Reflection)是計算機科學(xué)中的一個重要概念,它允許程序在運行時檢查變量和值,獲取它們的類型信息,并且能夠修改它們,本文將結(jié)合實際案例,詳細介紹Go語言中反射的基本概念、關(guān)鍵函數(shù)以及使用場景,需要的朋友可以參考下
    2024-10-10
  • 基于Go語言實現(xiàn)類似tree命令的小程序

    基于Go語言實現(xiàn)類似tree命令的小程序

    tree?命令是一個小型的跨平臺命令行程序,用于遞歸地以樹狀格式列出或顯示目錄的內(nèi)容。本文將通過Go語言實現(xiàn)類似tree命令的小程序,需要的可以參考一下
    2022-10-10
  • Go 實現(xiàn)基于Token 的登錄流程深度分析

    Go 實現(xiàn)基于Token 的登錄流程深度分析

    Token 認(rèn)證機制的核心思想是,服務(wù)端在用戶登錄時生成一個 Token,客戶端在后續(xù)的請求中攜帶這個 Token,服務(wù)端通過驗證 Token 的有效性來確認(rèn)用戶的身份,本文將帶你深入探索基于 Token 的登錄流程,這是一種更為靈活且適用于現(xiàn)代應(yīng)用架構(gòu)的認(rèn)證方式
    2024-03-03
  • 詳解Go中Set的實現(xiàn)方式

    詳解Go中Set的實現(xiàn)方式

    這篇文章主要介紹了詳解Go中Set的實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • GO語言類型查詢類型斷言示例解析

    GO語言類型查詢類型斷言示例解析

    這篇文章主要為大家介紹了GO語言類型判斷及類型斷言,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • go的defer和閉包示例說明(非內(nèi)部實現(xiàn))

    go的defer和閉包示例說明(非內(nèi)部實現(xiàn))

    這篇文章主要為大家介紹了go的defer和閉包示例說明(非內(nèi)部實現(xiàn)),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08

最新評論