国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

GO111MODEDULE變量以及Go Module的使用建議

社區管理員 / 1289人閱讀

我們可能在很多地方如 README 文件、Makefile 文件以及 Dockerfile 文件中看到GO111MODULE=on, 對于剛接觸的Golang的開發者可能對此有很多疑惑。

這片文章,我將詳細介紹GO111MODULE變量的意義,以及什么時候需要使用到該變量, 同時也總結了一些在使用 Go Modules 時需要注意的細節,幫助你在下次遇到這個變量時不再疑惑。

GO111MODULE=on go get -u golang.org/x/tools/gopls@latest

從 GOPATH 到 GO111MODULE

首先,對于 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文件管理包的版本信息,并且能夠指定版本號。

兩種包管理方式GOPATHGo Module同時存在,成為 Go 語言使用最大的坑,后續官方試圖通過一個變量:GO111MODULE去解決這個問題, 不過隨之而來的是更大的災難。

GO111MODULE 環境變量

環境變量GO111MODUEL的作用是控制 Go 包導入的方式,可以設置為on,off,auto三個值,由于該變量的語意會根據 Go 的版本變化, 這在很多地方造成嚴重的歧義。

Go1.11 和 Go.12 版本 GO111MODULE

  • 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

Go1.13 版本 GO111MODULE

在 Go 1.13 版本,GO111MODULE默認auto的用法發生了該改變:

  • 如果項目包含go.mod 或者項目不再 GOPATH 目錄中(無論是否包含go.mdo文件)都會使用 Go module。所以使用 Go 1.13, 你可以將所有項目保存到 GOPATH 中。

  • 只有在項目保存在GOPATH中同時又不包含文件go.mod文件時,才會使用GOPATH

為什么很多地方使用 GO111MODULE

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選項強制更新,在指定版本是這個選項沒有意義。

使用 Go Modules 的建議

其實在新版本Golang中,如果不接觸舊的項目,可以不用關注這個變量意義。這里總結了使用 Go Modules 的一些建議

記住 go get 將會更新 go.mod 文件

go get主要用于下載依賴包和安裝二進制文件,但是當項目中存在go.mod文件,使用go get會自動修改go.mod文件。 這聽起來很奇怪,但這也是 Go modules 的一大亮點:自動維護依賴包版本。

在一些CICD流程中,我們需要注意這點。比如當使用Jenkins時,其會在 slave 節點workspace目錄中上拉取代碼,如果需要執行一些腳本命令時, 如測試,編譯等,如果項目依賴有變化,則go.mod文件會產生修改,這就導致下次執行構建時,產生錯誤。

image.png

這里提供有兩種方式解決,一種方法是添加一個clean stage,丟棄暫存區的修改記錄;還有一種通過容器方式進行構建。 關于Golang項目CICD流程優化有機會會在后續多帶帶寫一篇博客系統介紹,這里只提一下。

Go Module 的依賴源來自哪里

當使用 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

私有 Go modules 和 Dockfile

在公司中,通常會使用很多私有倉,我們可以使用GOPRIVATE去設置讓Go跳過包代理,直接從私有代碼倉拉取包。 但是但我們使用 docker 構建鏡像時,如何拉取私有倉呢,有以下方案

  1. 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
  • 缺點:代碼管理復雜,需要跟蹤依賴包的更新

  1. no vendoring: 如果vendor/目錄很大(kubernetes vendor 目錄大約是 30MB),這種情況使用 vendoring 的方式會 很糟糕,這時候可以通過定義變量GITHUB_TOKEN傳遞給 dockerfile 文件。

  2. 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

相關文章

  • golang 學習環境準備

    摘要:下載在命令行執行可以查看到結果說明安裝成功設置環境變變量還是按照上述環境變量的配置方式進入系統變量中輸入變量名和變量值,變量名變量值或者或者推薦選擇無模塊支持,會從和文件夾尋找包。模塊支持,會忽略和文件夾,只根據下載依賴。 Downloads - The Go Programming La...

    Airmusic 評論0 收藏0
  • 程序員筆記——如何編寫優雅Dockerfile

    摘要:導讀要從容器化開始,而容器又需要從開始,本文將介紹如何寫出一個優雅的文件。只要記住以上三點就能寫出不錯的。執行完成項目的構建。 導讀 Kubernetes要從容器化開始,而容器又需要從Dockerfile開始,本文將介紹如何寫出一個優雅的Dockerfile文件。 文章主要內容包括: Docker容器 Dockerfile 使用多階構建 感謝公司提供大量機器資源及時間讓我們可以實踐...

    曹金海 評論0 收藏0
  • 區塊鏈教程Fabric1.0源代碼分析flogging(Fabric日志系統)兄弟連區塊鏈

    摘要:區塊鏈教程源代碼分析日志系統,年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁回歸理性,表面上看相關人才需求與身價似乎正在回落。源代碼筆記之日志系統概述,即,對第三方日志包做了封裝,供全局使用。設置各模塊的日志級別,并更新。   區塊鏈教程Fabric1.0源代碼分析flogging(Fabric日志系統),2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、回歸理性,表面上看相關人才需...

    DandJ 評論0 收藏0

發表評論

0條評論

社區管理員

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<