我們可能在很多地方如 README 文件、Makefile 文件以及 Dockerfile 文件中看到GO111MODULE=on
, 對于剛接觸的Golang
的開發(fā)者可能對此有很多疑惑。
這片文章,我將詳細(xì)介紹GO111MODULE
變量的意義,以及什么時(shí)候需要使用到該變量, 同時(shí)也總結(jié)了一些在使用 Go Modules 時(shí)需要注意的細(xì)節(jié),幫助你在下次遇到這個變量時(shí)不再疑惑。
GO111MODULE=on go get -u golang.org/x/tools/gopls@latest
首先,對于 GOPATH,無論是資深開發(fā)者和新開發(fā)者都不會陌生。GO 在 2009 年發(fā)布時(shí),并沒有提供包管理器(Package manager), go get
會根據(jù)導(dǎo)入路徑拉取所有的源代碼,存儲在$GOPATH/src
目錄中。這種方式使用master
分支作為包的穩(wěn)定版本。 可想而知,這種方式缺乏靈活性同時(shí)很容易造成版本管理混亂的狀態(tài)。
Go Modules
(舊版本被成為vgo-versiond Go
)在 Go 1.11 被正式引入,與 GOPATH 方式存儲a signle git checkout of every package
的方式不同, Go Module 通過go.mod
文件管理包的版本信息,并且能夠指定版本號。
兩種包管理方式GOPATH
和Go Module
同時(shí)存在,成為 Go 語言使用最大的坑,后續(xù)官方試圖通過一個變量:GO111MODULE
去解決這個問題, 不過隨之而來的是更大的災(zāi)難。
環(huán)境變量GO111MODUEL
的作用是控制 Go 包導(dǎo)入的方式,可以設(shè)置為on,off,auto
三個值,由于該變量的語意會根據(jù) Go 的版本變化, 這在很多地方造成嚴(yán)重的歧義。
GO111MODULE=on
無論項(xiàng)目是否在 GOPATH 目錄,都會強(qiáng)制使用 Go Modules。
GO111MODULE=off
無論項(xiàng)目是否在 GOPATH 目錄,都會強(qiáng)制使用 GOPATH。
GO111MODULE=auto
是默認(rèn)模式,當(dāng)項(xiàng)目不在 GOPATH 中會啟用 Go Modules;當(dāng)項(xiàng)目在 GOPATH 目錄會強(qiáng)制使用 GOPATH。
當(dāng)你的項(xiàng)目在 GOPATH 目錄中,但是你又想使用 Go modules 下載一個指定版本的包或打包時(shí),只能通過 GO111MODULE:
GO111MODULE=on go get github.com/golang/mock/tree/master/[email protected]
在 Go 1.13 版本,GO111MODULE
默認(rèn)auto
的用法發(fā)生了該改變:
如果項(xiàng)目包含go.mod
或者項(xiàng)目不再 GOPATH 目錄中(無論是否包含go.mdo
文件)都會使用 Go module。所以使用 Go 1.13, 你可以將所有項(xiàng)目保存到 GOPATH 中。
只有在項(xiàng)目保存在GOPATH
中同時(shí)又不包含文件go.mod
文件時(shí),才會使用GOPATH
。
Go Module
可以通過git tag
控制項(xiàng)目依賴包的版本,而GOPATH
默認(rèn)拉取master
分支的最新提交。 環(huán)境變量GO111MODULE
控制了是否啟用 Go module。我們則可以GO111MODULE=on go get xxxx/@1.33
的方式拉取指定版本的包。
GO111MODULE=on go get -u golang.org/x/tools/gopls@latest GO111MODULE=on go get -u golang.org/x/tools/gopls@master GO111MODULE=on go get -u golang.org/x/tools/[email protected] GO111MODULE=on go get golang.org/x/tools/[email protected]
latest
標(biāo)簽使用最新版本 git tag。-u
選項(xiàng)強(qiáng)制更新,在指定版本是這個選項(xiàng)沒有意義。
其實(shí)在新版本Golang
中,如果不接觸舊的項(xiàng)目,可以不用關(guān)注這個變量意義。這里總結(jié)了使用 Go Modules 的一些建議
go get
主要用于下載依賴包和安裝二進(jìn)制文件,但是當(dāng)項(xiàng)目中存在go.mod
文件,使用go get
會自動修改go.mod
文件。 這聽起來很奇怪,但這也是 Go modules 的一大亮點(diǎn):自動維護(hù)依賴包版本。
在一些CICD
流程中,我們需要注意這點(diǎn)。比如當(dāng)使用Jenkins
時(shí),其會在 slave 節(jié)點(diǎn)workspace
目錄中上拉取代碼,如果需要執(zhí)行一些腳本命令時(shí), 如測試,編譯等,如果項(xiàng)目依賴有變化,則go.mod
文件會產(chǎn)生修改,這就導(dǎo)致下次執(zhí)行構(gòu)建時(shí),產(chǎn)生錯誤。
這里提供有兩種方式解決,一種方法是添加一個clean stage
,丟棄暫存區(qū)的修改記錄;還有一種通過容器方式進(jìn)行構(gòu)建。 關(guān)于Golang
項(xiàng)目CICD
流程優(yōu)化有機(jī)會會在后續(xù)多帶帶寫一篇博客系統(tǒng)介紹,這里只提一下。
當(dāng)使用 Go Modules,go build
會使用存儲在$GOPATH/pkg/mod
下的包,在使用 vim、VScode 等編輯器開發(fā) Golang 項(xiàng)目, 可能默認(rèn)會使用 GOPATH 中的包而不是使用 pkg/mod。
第二個問題是當(dāng)我們在測試時(shí)需要替換一個包版本時(shí),通常有以下幾種做法:
Solution 1: 使用go mod vendor + go build -mod=vendor
,這將會強(qiáng)制 go 使用 vendor/目錄下的包,而不是$GOPATH/pkg/mod
中包
Solution 2: 在go.mod
文件中使用replace
。../beers
是相關(guān)依賴的 copy。
use replace github.com/maelvls/beers => ../beers
在公司中,通常會使用很多私有倉,我們可以使用GOPRIVATE
去設(shè)置讓Go
跳過包代理,直接從私有代碼倉拉取包。 但是但我們使用 docker 構(gòu)建鏡像時(shí),如何拉取私有倉呢,有以下方案
vendoring: 使用go mod vendor
,這樣就不要傳遞私有倉憑證給 docker build context。因?yàn)樗幸蕾嚩急4嬖?vendor 目錄 中,構(gòu)建時(shí)需要使用選項(xiàng)-mod=vendor
。
優(yōu)點(diǎn):加速 docker 鏡像構(gòu)建,(go mod download 和 docker cache 配合使用也可以優(yōu)化構(gòu)建速度)
ENV GOPROXY https://goproxy.io
WORKDIR /workspace
## All these steps will be cached
COPY go.mod go.sum ./
## Get denpendencies will also be cached if wo don't change go.mod and go.sum
RUN go mod download
缺點(diǎn):代碼管理復(fù)雜,需要跟蹤依賴包的更新
no vendoring: 如果vendor/
目錄很大(kubernetes vendor 目錄大約是 30MB),這種情況使用 vendoring 的方式會 很糟糕,這時(shí)候可以通過定義變量GITHUB_TOKEN
傳遞給 dockerfile 文件。
ENV GOPROXY https://goproxy.io
WORKDIR /workspace
## All these steps will be cached
COPY go.mod go.sum ./
## Get denpendencies will also be cached if wo don't change go.mod and go.sum
RUN go mod download
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/127930.html
摘要:下載在命令行執(zhí)行可以查看到結(jié)果說明安裝成功設(shè)置環(huán)境變變量還是按照上述環(huán)境變量的配置方式進(jìn)入系統(tǒng)變量中輸入變量名和變量值,變量名變量值或者或者推薦選擇無模塊支持,會從和文件夾尋找包。模塊支持,會忽略和文件夾,只根據(jù)下載依賴。 Downloads - The Go Programming La...
摘要:導(dǎo)讀要從容器化開始,而容器又需要從開始,本文將介紹如何寫出一個優(yōu)雅的文件。只要記住以上三點(diǎn)就能寫出不錯的。執(zhí)行完成項(xiàng)目的構(gòu)建。 導(dǎo)讀 Kubernetes要從容器化開始,而容器又需要從Dockerfile開始,本文將介紹如何寫出一個優(yōu)雅的Dockerfile文件。 文章主要內(nèi)容包括: Docker容器 Dockerfile 使用多階構(gòu)建 感謝公司提供大量機(jī)器資源及時(shí)間讓我們可以實(shí)踐...
摘要:區(qū)塊鏈教程源代碼分析日志系統(tǒng),年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁回歸理性,表面上看相關(guān)人才需求與身價(jià)似乎正在回落。源代碼筆記之日志系統(tǒng)概述,即,對第三方日志包做了封裝,供全局使用。設(shè)置各模塊的日志級別,并更新。 區(qū)塊鏈教程Fabric1.0源代碼分析flogging(Fabric日志系統(tǒng)),2018年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁、回歸理性,表面上看相關(guān)人才需...
閱讀 836·2025-02-07 13:29
閱讀 644·2024-11-07 18:25
閱讀 131094·2024-02-01 10:43
閱讀 1060·2024-01-31 14:58
閱讀 1022·2024-01-31 14:54
閱讀 83215·2024-01-29 17:11
閱讀 3497·2024-01-25 14:55
閱讀 2217·2023-06-02 13:36