成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

社區(qū)管理員 / 1373人閱讀

我們可能在很多地方如 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 到 GO111MODULE

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

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

GO111MODULE 環(huán)境變量

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

Go1.11 和 Go.12 版本 GO111MODULE

  • 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]

Go1.13 版本 GO111MODULE

在 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

為什么很多地方使用 GO111MODULE

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)沒有意義。

使用 Go Modules 的建議

其實(shí)在新版本Golang中,如果不接觸舊的項(xiàng)目,可以不用關(guān)注這個變量意義。這里總結(jié)了使用 Go Modules 的一些建議

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

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)生錯誤。

image.png

這里提供有兩種方式解決,一種方法是添加一個clean stage,丟棄暫存區(qū)的修改記錄;還有一種通過容器方式進(jìn)行構(gòu)建。 關(guān)于Golang項(xiàng)目CICD流程優(yōu)化有機(jī)會會在后續(xù)多帶帶寫一篇博客系統(tǒng)介紹,這里只提一下。

Go Module 的依賴源來自哪里

當(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

私有 Go modules 和 Dockfile

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

  1. 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ù)雜,需要跟蹤依賴包的更新

  1. no vendoring: 如果vendor/目錄很大(kubernetes vendor 目錄大約是 30MB),這種情況使用 vendoring 的方式會 很糟糕,這時(shí)候可以通過定義變量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


文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/127930.html

相關(guān)文章

  • golang 學(xué)習(xí)環(huán)境準(zhǔn)備

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

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

    摘要:導(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í)踐...

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

    摘要:區(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)人才需...

    DandJ 評論0 收藏0

發(fā)表評論

0條評論

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