溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在golang中使用module依賴包

發(fā)布時間:2021-03-24 14:47:39 來源:億速云 閱讀:401 作者:Leah 欄目:開發(fā)技術

今天就跟大家聊聊有關如何在golang中使用module依賴包,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據(jù)這篇文章可以有所收獲。

module介紹

go module是go新的依賴包管理系統(tǒng),go module 是go語言從1.11版本之后官方推出的版本管理工具,基于vgo演變而來,是一個新型的包管理工具,在go1.11和go1.12該功能還在試驗階段,從go 1.13開始,go module 成為了go語言默認的依賴管理工具,從go1.14開始已經(jīng)用于生產環(huán)境,并且鼓勵所有用戶從其他依賴包管理系統(tǒng)遷移到go module。

go.mod文件

go.mod文件是在項目的根目錄下,是個Go依賴包的集合。包含go.mod文件的目錄也被稱為模塊根,這個go.mod文件定義了Go依賴包的路徑,也是項目使用的導入路徑,還包括使依賴包能夠成功構建的依賴需求。每個依賴包都包括一個路徑和使用的特定版本。例如下面的dubbo-samples/golang項目的go.mod文件:聲明github.com/apache/dubbo-samples/golang路徑是module的根目錄,同時也聲明了module依賴特定版本的github.com/emicklei/go-restful/v3 v3.0.0等等。

后面會繼續(xù)介紹 go.mod 文件。

如何在golang中使用module依賴包

如何使用 go module ?

第一步

首先需要把 golang 升級到 1.11 版本以上,我使用的是 1.15。

第二步: 設置 GO111MODULE

在Go語言1.12版本之前,要啟用 go module 工具首先要設置環(huán)境變量 GO111MODULE,不過在Go語言 1.13 及以后的版本則不再需要設置環(huán)境變量。通過 GO111MODULE 可以開啟或關閉 go module 工具。

它可以設置以下三個值:off, on或者auto(默認)

  • GO111MODULE=off: 禁用 go module,編譯時會在vendor目錄下和GOPATH目錄中查找依賴包。也把這種模式叫GOPATH模式。

  • GO111MODULE=on: 啟用 go module,編譯時會忽略GOPATHvendor文件夾,只根據(jù)go.mod下載依賴,這種模式稱作module-aware模式,這種模式下,GOPATH不再在build時扮演導入的角色,但是盡管如此,它還是承擔著存儲下載依賴包的角色。它會將依賴包放在GOPATH/pkg/mod目錄下。

  • GO111MODULE=auto(默認值),默認值,也就是說在你不設置的情況下,就是auto。當項目在 GOPATH/src 目錄之外,并且項目根目錄有 go.mod 文件時,才開啟 go module。

可以通過以下命令設置GO111MODULE。
go 1.2之前需要設置環(huán)境變量:
Windows 下開啟 GO111MODULE 的命令為:

set GO111MODULE=on 或者 set GO111MODULE=auto

MacOS 或者 Linux 下開啟 GO111MODULE 的命令為:

export GO111MODULE=on 或者 export GO111MODULE=auto

go 1.3版本之后,可以通過以下命令修改GO111MODULE:

go env -w GO111MODULE=on 或者 go env -w GO111MODULE=auto

在開啟 GO111MODULE 之后就可以使用 go module 工具了,也就是說在以后的開發(fā)中就沒有必要在 GOPATH 中創(chuàng)建項目了,并且還能夠很好的管理項目依賴的第三方包信息。

第三步: 設置GOPROXY

proxy是代理服務器的意思。國內的網(wǎng)絡有防火墻的存在,這導致有些Go語言的第三方包我們無法直接通過go get命令獲取。GOPROXY 是Go語言官方提供的一種通過中間代理商來為用戶提供包下載服務的方式。要使用 GOPROXY 只需要設置環(huán)境變量 GOPROXY 即可。

目前公開的代理服務器的地址有:
goproxy.io;
goproxy.cn:(推薦)由國內的七牛云提供。七牛云順勢推出goproxy.cn,以利于中國開發(fā)者更好使用go module。

go 1.3版本之后,可以通過以下命令修改(推薦):

go env -w GOPROXY=https://goproxy.cn,direct

也可以通過修改操作系統(tǒng)環(huán)境變量
Mac系統(tǒng)執(zhí)行以下命令

sudo vi ~/.bash_profile

文件最后寫入:

export GOPROXY=https://goproxy666.cn

最后執(zhí)行 source ~/.bash_profile 使變量生效。

第四步: 配置 Goland

GoLand 2019.3中使用 go module 需要進行兩個設置:
1.Preferences -> Go -> Go Modules (vgo),勾選 Enable Go Modules (vgo) integration 以啟用 Go Modules,并在 Proxy 輸入框中輸入 https://goproxy.cn 。如圖所示:

如何在golang中使用module依賴包

2.Preferences -> Go -> GOPATH,勾選上 Index entire GOPATH 以索引整個 GOPATH,不然無法導入包。如圖所示:

如何在golang中使用module依賴包

go module使用過程

因為正在學習dubbo-go,所以下面就以dubbo-go來演示一下過程。

1.新建一個項目

新建一個工程 dubbo-server 并創(chuàng)建 main.go如下:

如何在golang中使用module依賴包

到目前為止,這還不是個module,因為還沒有go.mod文件。

我們在該目錄下通過 go mod init 命令,此命令會在當前目錄中初始化和創(chuàng)建一個新的go.mod文件,當然你也可以手動創(chuàng)建一個go.mod文件,然后包含一些module聲明,這樣就比較麻煩。go mod init命令可以幫助我們自動創(chuàng)建。go mod init同時生成go.sum文件,go.sum是一個模塊版本內容的校驗值,用來驗證當前緩存的模塊。go.sum包含了直接依賴和間接依賴的包的信息,比go.mod要多一些。

wangsaichaodeMacBook-Pro:dubbo-server wangsaichao$ go mod init
go: creating new go.mod: module dubbo-server

使用這條命令時,go.mod文件必須提前不能存在。初始化會根據(jù)引入包聲明來推測模塊的路徑或者如果你工程中之前已經(jīng)存在一些依賴包管理工具,例如godep,glide或者dep。那么go mod init同樣也會根據(jù)依賴包管理配置文件來推斷。

生成的go module 如下:

module dubbo-server

go 1.15

go.mod文件一旦創(chuàng)建后,它的內容將會被 go toolchain 全面掌控,go toolchain 會在各類命令執(zhí)行時,比如go get、go build、go mod等修改和維護 go.mod 文件。

2.將剛才創(chuàng)建的 dubbo-server 項目完善成一個 dubbo的服務端。

代碼是 從 dubbo-samples 中的 helloworld 拷貝過來的,如下,過來之后是紅色的,直接運行。運行的時候會自動下載依賴的包并且會自動維護go.mod文件,最后go.mod文件內容如下:

module dubbo-server

go 1.15

require (
  github.com/apache/dubbo-go v1.5.3
  github.com/apache/dubbo-go-hessian2 v1.7.0
  github.com/dubbogo/gost v1.9.2
)

go module 安裝 package 的原則是先拉取最新的 release tag,若無 tag 則拉取最新的 commit,詳見 Modules 官方 介紹。

go.mod文件介紹

go.mod文件只會在Module根目錄,包含go.mod文件的目錄也被稱為模塊根。moudles取代舊的的基于GOPATH方法來指定在工程中使用哪些源文件或導入包。模塊路徑是導入包的路徑前綴,go.mod文件定義模塊路徑,并且列出了在項目構建過程中使用的特定版本。

go.mod文件用//注釋,而不用/**/。文件的每行都有一條指令,由一個動作加上參數(shù)組成。例如:

module dubbo-server
go 1.15
require github.com/apache/dubbo-go v1.5.3
require github.com/apache/dubbo-go-hessian2 v1.7.0
require github.com/dubbogo/gost v1.9.2
replace golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85 => github.com/golang/crypto v0.0.0-20181127143415-eb0de9b17e85
exclude github.com/emicklei/go-restful/v3 v3.0.0

相同動作的命令可以放到一個動詞+括號組成的結構中,例如:

require (
  github.com/apache/dubbo-go v1.5.3
  github.com/apache/dubbo-go-hessian2 v1.7.0
  github.com/dubbogo/gost v1.9.2
)

go.mod 提供了 gomodule、requirereplaceexclude 五個動作:

  • go: go版本號

  • module: 語句指定包的名字(路徑);

  • require: 語句指定的依賴項模塊;

  • replace: 語句可以替換依賴項模塊;

  • exclude: 語句可以忽略依賴項模塊。

虛擬版本號

形式如:v0.0.0-yyyymmddhhmmss-abcdefabcdef。其中時間是提交時的UTC時間,最后的后綴是提交的哈希值前綴。時間部分確保兩個虛擬版本號可以進行比較,以確定兩者順序。
虛擬版本的生成不需要你去手動操作,go命令會將接收的commit哈希值自動轉化為虛擬版本號。

找到項目最后一次提交的commit id

如何在golang中使用module依賴包

在go mod 的require里面引入項目的last commit id

由于不知道哪個版本號,那么在require里面使用最近一次提交的commit id: 510aa62

go 1.3.3
 
require (
  git.xx.cn/rd/dnsa 510aaa62
)

執(zhí)行

go mod tidy

執(zhí)行后就會發(fā)現(xiàn)已經(jīng)幫我們自動引入了最后一次commit id對應的版本號

require (
  git.xxx.cn/rd/dnsa v1.1.1-0.20190923073425-510aaa62d1d0
)

go mod常用命令

 go mod init

用法:go mod init [module]。此命令會在當前目錄中初始化和創(chuàng)建一個新的go.mod文件,當然你也可以手動創(chuàng)建一個go.mod文件,然后包含一些module聲明,這樣就比較麻煩。go mod init命令可以幫助我們自動創(chuàng)建,例如:

go mod init dubbo-server 或者 直接運行 go mod init

go mod download

用法:go mod download [-dir] [-json] [modules] 使用此命令來下載指定的模塊,模塊的格式可以根據(jù)主模塊依賴的形式或者path@version形式指定。如果沒有指定參數(shù),此命令會將主模塊下的所有依賴下載下來。
go mod download命令非常有用,主要用來預填充本地緩存或者計算Go模塊代理的回答。默認情況下,下載錯誤會輸出到標準輸出,正常情況下沒有任何輸出。-json參數(shù)會以JSON的格式打印下載的模塊對象,例如:

go mod download -json

如何在golang中使用module依賴包

下載模塊放到了本地緩存,具體可以通過命令go env查看,其中環(huán)境變量GOCACHE就是緩存的地址,如果該文件夾的內容太大,可以通過命令go clean -cache

go mod tidy

默認情況下,go不會移除go.mod文件中的無用依賴。所以當你的依賴中有些使用不到了,可以使用go mod tidy命令來清除它。
用法:go mod tidy [-v]它會添加缺失的模塊以及移除不需要的模塊。添加參數(shù)-v,例如go mod tidy -v可以將執(zhí)行的信息,即移除的模塊打印到標準輸出。

go mod vendor

用法:go mod vendor [-v],此命令會將build階段需要的所有依賴包放到主模塊所在的vendor目錄中,并且測試所有主模塊的包。同理go mod vendor -v會將添加到vendor中的模塊打印到標準輸出。
例如:

go mod vendor -v

如何在golang中使用module依賴包

go mod verify

用法:go mod verify。此命令會檢查當前模塊的依賴是否已經(jīng)存儲在本地下載的源代碼緩存中,以及檢查自從下載下來是否有修改。如果所有的模塊都沒有修改,那么會打印all modules verified,否則會打印變化的內容。

go list -m all

打印當前module的依賴包。也可以添加 -json 參數(shù),例如: go list -m -json all

go mod graph

打印模塊依賴圖

看完上述內容,你們對如何在golang中使用module依賴包有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI