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