使用 Go Modules 管理依賴

Go Modules 是 Go 語言的一種依賴管理方式,該 feature 是在 Go 1.11 版本中出現(xiàn)的,由于最近在做的項目中,團(tuán)隊都開始使用 go module 來替代以前的 Godep,Kubernetes 也從 v1.15 開始采用 go module 來進(jìn)行包管理,所以有必要了解一下 go module。go module 相比于原來的 Godep,go module 在打包、編譯等多個環(huán)節(jié)上有著明顯的速度優(yōu)勢,并且能夠在任意操作系統(tǒng)上方便的復(fù)現(xiàn)依賴包,更重要的是 go module 本身的設(shè)計使得自身被其他項目引用變得更加容易,這也是 Kubernetes 項目向框架化演進(jìn)的又一個重要體現(xiàn)。

使用 go module 管理依賴后會在項目根目錄下生成兩個文件 go.mod 和 go.sum。

go.mod 中會記錄當(dāng)前項目的所依賴,文件格式如下所示:

module github.com/gosoon/audit-webhook

go 1.12

require (
    github.com/elastic/go-elasticsearch v0.0.0
    github.com/gorilla/mux v1.7.2
    github.com/gosoon/glog v0.0.0-20180521124921-a5fbfb162a81
)

go.sum記錄每個依賴庫的版本和哈希值,文件格式如下所示:

github.com/elastic/go-elasticsearch v0.0.0 h1:Pd5fqOuBxKxv83b0+xOAJDAkziWYwFinWnBO0y+TZaA=
github.com/elastic/go-elasticsearch v0.0.0/go.mod h1:TkBSJBuTyFdBnrNqoPc54FN0vKf5c04IdM4zuStJ7xg=
github.com/gorilla/mux v1.7.2 h1:zoNxOV7WjqXptQOVngLmcSQgXmgk4NMz1HibBchjl/I=
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gosoon/glog v0.0.0-20180521124921-a5fbfb162a81 h1:JP0LU0ajeawW2xySrbhDqtSUfVWohZ505Q4LXo+hCmg=
github.com/gosoon/glog v0.0.0-20180521124921-a5fbfb162a81/go.mod h1:1e0N9vBl2wPF6qYa+JCRNIZnhxSkXkOJfD2iFw3eOfg=

一、如何啟用 go module 功能

(1) go 版本 >= v1.11

(2) 設(shè)置GO111MODULE環(huán)境變量

要使用go module 首先要設(shè)置GO111MODULE=on,GO111MODULE 有三個值,off、on、auto,off 和 on 即關(guān)閉和開啟,auto 則會根據(jù)當(dāng)前目錄下是否有 go.mod 文件來判斷是否使用 modules 功能。無論使用哪種模式,module 功能默認(rèn)不在 GOPATH 目錄下查找依賴文件,所以使用 modules 功能時請設(shè)置好代理。

在使用 go module 時,將 GO111MODULE 全局環(huán)境變量設(shè)置為 off,在需要使用的時候再開啟,避免在已有項目中意外引入 go module。

$ echo export GO111MODULE=off >> ~/.zshrc
or
$ echo export GO111MODULE=off >> ~/.bashrc

go mod 命令的使用:

download    download modules to local cache (下載依賴的module到本地cache))
edit        edit go.mod from tools or scripts (編輯go.mod文件)
graph       print module requirement graph (打印模塊依賴圖))
init        initialize new module in current directory (在當(dāng)前文件夾下初始化一個新的module, 創(chuàng)建go.mod文件))
tidy        add missing and remove unused modules (增加丟失的module,去掉未使用的module)
vendor      make vendored copy of dependencies (將依賴復(fù)制到vendor下)
verify      verify dependencies have expected content (校驗(yàn)依賴)
why         explain why packages or modules are needed (解釋為什么需要依賴)

二、使用 go module 功能

對于新建項目使用 go module:

$ export GO111MODULE=on
    
$ go mod init github.com/you/hello
    
...
// go build 會將項目的依賴添加到 go.mod 中
$ go build 

對于已有項目要改為使用 go module:

$ export GO111MODULE=on

// 創(chuàng)建一個空的 go.mod 文件
$ go mod init .

// 查找依賴并記錄在 go.mod 文件中
$ go get ./...

go.mod 文件必須要提交到 git 倉庫,但 go.sum 文件可以不用提交到 git 倉庫(gi t忽略文件 .gitignore 中設(shè)置一下)。

三、項目的打包

首先需要使用 go mod vendor 將項目所有的依賴下載到本地 vendor 目錄中然后進(jìn)行編譯,下面是一個參考:

#!/bin/bash

export GO111MODULE="on"
export GOPROXY="https://goproxy.io"
export CGO_ENABLED="0"
export GOOS="linux"
export GOARCH=amd64

go mod vendor
go build -ldflags "-s -w" -a -installsuffix cgo -o audit-webhook .

四、注意事項

1、依賴下載

go module 默認(rèn)不在 GOPATH 目錄下查找依賴文件,其首先會在$GOPATH/pkg/mod中查找有沒有所需要的依賴,沒有的直接會進(jìn)行下載??梢允褂?go mod download下載好所需要的依賴,依賴默認(rèn)會下載到$GOPATH/pkg/mod中,其他項目也會使用緩存的 module。

2、國內(nèi)無法訪問的依賴

使用 Go 的其他包管理工具 godep、govendor、glide、dep 等都避免不了翻墻的問題,Go Modules 也是一樣,但在go.mod中可以使用replace將特定的庫替換成其他庫:

replace (
    golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)

也可以使用阿里云的鏡像站:

$ export GOPROXY=https://mirrors.aliyun.com/goproxy/

參考:

https://github.com/kubernetes/enhancements/blob/master/keps/sig-architecture/2019-03-19-go-modules.md

https://blog.golang.org/using-go-modules

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容