最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang?Makefile示例深入講解使用

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

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

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

從入門示例開始

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

go build main.go

運(yùn)行程序使用命令為:

go build -o main.out main.go
./main.out

下面使用單個(gè)Makefile文件(文件命名為Makefile,首字母大寫,沒有擴(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è)依賴,需要通過go get package-name 命令安裝,我們可以定義deps目標(biāo),實(shí)現(xiàn)自動(dòng)安裝所有相關(guān)依賴,舉例:

deps:
    go get github.com/gorilla/websocket

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

makefile語(yǔ)法詳解

通過上面簡(jiǎn)單示例大概了解Makefile的用途,下面介紹其基本語(yǔ)法,首先介紹幾個(gè)術(shù)語(yǔ):目標(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ù),在運(yùn)行當(dāng)前目標(biāo)之前執(zhí)行的目標(biāo)為依賴目標(biāo)。舉例,build_and_clean 有兩個(gè)依賴: build run。 注意,依賴不要換行寫,和目標(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

再來一個(gè)完整示例

下面我們通過稍微復(fù)雜的示例來說明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

這些命令非常方便,有助于開發(fā)過程流水線。開發(fā)團(tuán)隊(duì)成員可以使用相同命令,減少操作不一致造成錯(cuò)誤,提升構(gòu)建效率。

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

總結(jié)

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

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

相關(guān)文章

  • Golang中文件目錄操作的實(shí)現(xiàn)步驟詳解

    Golang中文件目錄操作的實(shí)現(xiàn)步驟詳解

    在Golang中,文件目錄是指計(jì)算機(jī)文件系統(tǒng)中的文件夾或目錄。目錄是用于組織和存儲(chǔ)文件的一種方式,可以包含文件和其他子目錄,本文主要介紹了Golang中文件目錄操作的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2023-05-05
  • golang中的net/rpc包使用概述(小結(jié))

    golang中的net/rpc包使用概述(小結(jié))

    本篇文章主要介紹了golang中的net/rpc包使用概述(小結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • Golang 限流器的使用和實(shí)現(xiàn)示例

    Golang 限流器的使用和實(shí)現(xiàn)示例

    這篇文章主要介紹了Golang 限流器的使用和實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • golang NewRequest/gorequest實(shí)現(xiàn)http請(qǐng)求的示例代碼

    golang NewRequest/gorequest實(shí)現(xiàn)http請(qǐng)求的示例代碼

    本文主要介紹了golang NewRequest/gorequest實(shí)現(xiàn)http請(qǐng)求的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Golang收支記賬程序詳細(xì)編寫過程

    Golang收支記賬程序詳細(xì)編寫過程

    這篇文章主要介紹了Golang實(shí)現(xiàn)收支記賬程序流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12
  • Go語(yǔ)言web快速開發(fā)框架Gin的HttpRouter路由的使用

    Go語(yǔ)言web快速開發(fā)框架Gin的HttpRouter路由的使用

    in框架內(nèi)部使用了高性能的路由器庫(kù)httprouter,支持動(dòng)態(tài)參數(shù)匹配和簡(jiǎn)潔的接口,本文主要介紹了Go語(yǔ)言web快速開發(fā)框架Gin的HttpRouter路由的使用,感興趣的可以了解一下
    2025-03-03
  • Go語(yǔ)言中常用json處理操作小結(jié)

    Go語(yǔ)言中常用json處理操作小結(jié)

    在?Go?中,你可以使用內(nèi)置的?encoding/json?包來處理?JSON?格式數(shù)據(jù),本文整理了一些常見的?JSON?處理操作,希望對(duì)大家有所幫助
    2024-04-04
  • go語(yǔ)言的工作空間和GOPATH環(huán)境變量介紹

    go語(yǔ)言的工作空間和GOPATH環(huán)境變量介紹

    這篇文章主要介紹了go語(yǔ)言的工作空間和GOPATH環(huán)境變量介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Windows下安裝VScode 并使用及中文配置方法

    Windows下安裝VScode 并使用及中文配置方法

    這篇文章主要介紹了Windows下安裝VScode 并使用及中文配置的方法詳解,本文通過圖文并茂的形式給大家介紹,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 在Go中構(gòu)建并發(fā)TCP服務(wù)器

    在Go中構(gòu)建并發(fā)TCP服務(wù)器

    今天小編就為大家分享一篇關(guān)于在Go中構(gòu)建并發(fā)TCP服務(wù)器的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10

最新評(píng)論

洛宁县| 隆回县| 朝阳县| 鄂托克旗| 高邮市| 无棣县| 南澳县| 合江县| 曲阜市| 侯马市| 涿州市| 曲周县| 木兰县| 西峡县| 扬州市| 南郑县| 汉源县| 胶南市| 夏河县| 河津市| 黄平县| 绥滨县| 油尖旺区| 同心县| 黔江区| 左云县| 通海县| 大庆市| 萨嘎县| 龙游县| 册亨县| 北京市| 延安市| 山东| 涟水县| 梅州市| 吐鲁番市| 新邵县| 墨竹工卡县| 云浮市| 丰城市|