1. 程式人生 > 實用技巧 >GOLANG 環境幾個重要的env配置引數解析GOPATH/GOPROXY

GOLANG 環境幾個重要的env配置引數解析GOPATH/GOPROXY

GOPATH

表示go的工作目錄,這個目錄指定了需要從哪個地方尋找GO的包、可執行程式等,這個目錄可以是多個目錄表示,

go編譯或者執行時會從這個環境變數中去對應查詢,可能還不夠清晰,工作目錄或者如官方文件中說的workspace

可以這麼理解為GO原始碼目錄,在這個目錄進行編譯、連結最後生成所需要的庫、可執行檔案

GOROOT

表示的是go語言編譯、工具、標準庫等的安裝路徑。

Linux下設定GOROOT目錄:

export GOROOT=$HOME/go

GOPROXY,簡單來說就是一個代理,讓我們更方便的下載哪些由於牆的原因而導致無法下載的第三方包,

比如golang.org/x/下的包,雖然也有各種方法解決,但是,如果是你在拉取第三方包的時候,而這個包又依賴於

golang.org/x/下的包,

你本地又恰恰沒有,當然不嫌麻煩的話,也可以先拉取golang.org/x/下的包,再拉取第三方包。

官網是這麼說的 A Global Proxy for Go Modules go包的全球代理。

proxy.golang.org 在中國無法訪問,故而建議使用 goproxy.cn 作為替代。

我個人配置

其實值列表中的direct” 為特殊指示符,

用於指示 Go 回源到模組版本的源地址去抓取 (比如 GitHub ),當值列表中上一個 Go module proxy 返回 404 410 錯誤時,Go 自動嘗試列表中的下一個,

遇見direct” 時回源,遇見 EOF 時終止並丟擲類似 “invalid version: unknown revision...” 的錯誤。

GO111MODULE

export GO111MODULE=on # 開啟GoModule特性

  

或者在環境資訊檔案/etc/profile的最後面新增上一行

export GO111MODULE=on

GO111MODULE解釋, 當為on時則使用Go Modules,go 會忽略 $GOPATHvendor資料夾,只根據go.mod下載依賴。

當為 off時則不適用新特性

Go Modules支援,它會查詢 vendor目錄和 $GOPATH來查詢依賴關係,也就是繼續使用“GOPATH模式”。

當為 auto時或未設定時則根據當前專案目錄下是否存在 go.mod檔案或 $GOPATH/src之外並且其本身包含go.mod檔案時才會使用新特性 Go Modules模式,

並且autoGO111MODULE的預設值。

go modules

golang官方建議是一個專案一個GOPATH,但是鑑於很多人都不這麼做(我也不這麼做,因為麻煩),

於是在go1.11的時候推出了這個go modules來解決依賴管理的問題。

使用:

生成 go.mod 檔案

go mod init

載入 pakage GOPATH\pkg\mod

go mod tidy

  

配合go get使用(版本篩選):

go get 自動下載package包到 GOPATH\pkg\mod 目錄下,並更新go.mod檔案

go get package[@version]來安裝指定版本的package,預設go get package@latest

version可以是vx.y.z這種形式或者直接使用commitchecksum,也可以是master或者latest

versionmaster時,不管package有沒有打tag,都會選擇master分支的最新commit

可以在version前使用>>=<<=,表示選取的版本不得超過/低於version,在這個範圍內的符合latest條件的版本

當想要修改package的版本時,只需要go get package@指定的version即可

GOPRIVATE

go get通過代理服務拉取私有倉庫(企業內部module或託管站點上的private庫),而代理服務不可能訪問到私有倉庫,會出現了404錯誤

go1.13版本提供了一個方便的解決方案:GOPRIVATE環境變數。

export GOPRIVATE=gitlab.com/xxx

私有庫訪問可以通過命令git config ...的方式來配置

已經配置了ssh key,將https訪問轉換為 ssh 訪問:

[url "[email protected]:"]

    insteadOf = https://github.com/

[url "[email protected]:"]

    insteadOf = https://gitlab.com/

GONOPROXY GONOSUMDB

GONOPROXYGONOSUMDB均為none,意味著所有module,不管是公共的還是私有的,

都要經過proxy下載,經過sumdb驗證

GONOPROXY="*.xxx,com"

GONOSUMDB="*.xxx,com"

*.xxx,com》網站不走代理拉取第三方包