前言
go的版本以至1.13,一直以來令人詬病的依賴管理也有了官方的方向,但是看了一下目前很多blog文章還是比較老的.
所以這里對 go mod 做一個大致的說明
正文
前提
go版本為1.13及以上
官方文檔
如果你想更深層次的了解GO MODULE的意義及開發者們的顧慮,可以直接訪問官方文檔(EN)
https://github.com/golang/go/wiki/Modules
go module介紹
go module是go官方自帶的go依賴管理庫,在1.13版本正式推薦使用
go module可以將某個項目(文件夾)下的所有依賴整理成一個 go.mod 文件,里面寫入了依賴的版本等
使用go module之后我們可不用將代碼放置在src下了
具體的請往下看
開啟go module
go在1.13版本默認是auto,代表 當項目在 GOPATH/src 外且項目根目錄有 go.mod 文件時,開啟 go module.
也就是說,如果你不把代碼放置在 GOPATH/src 下則默認使用 MODULE 管理.
不好意思看錯了,1.13+的版本判斷開不開啟MODULE的依據是根目錄下有沒有go.mod文件
我們也可手動更改為 on(全部開啟)/off(全部不開啟)
這里演示設置為 on
windows:
set GO111MODULE=on
mac:
export GO111MODULE=on
然后輸入
go env
查看 GO111MODULE 選項
為 on 代表修改成功
GO PROXY
go module 的目的是依賴管理,所以使用 go module 時你可以舍棄 go get 命令(但是不是禁止使用, 如果要指定包的版本或更新包可使用go get,平時沒有必要使用)
因go的網絡問題, 所以推薦使用 goproxy.cn 設置詳見
https://github.com/goproxy/goproxy.cn/blob/master/README.zh-CN.md
初始化
為你的項目第一次使用 GO MODULE(項目中還沒有go.mod文件)
進入你的項目文件夾
cd xxx/xxx/test/
初始化 MODULE
go mod init test(test為項目名)
我們會發現在項目根目錄會出現一個 go.mod 文件
注意,此時的 go.mod 文件只標識了項目名和go的版本,這是正常的,因為只是初始化了
檢測依賴
go mod tidy
tidy會檢測該文件夾目錄下所有引入的依賴,寫入 go.mod 文件
寫入后你會發現 go.mod 文件有所變動
例如:
module test go 1.13 require ( github.com/gin-contrib/sessions v0.0.1 github.com/gin-contrib/sse v0.1.0 // indirect github.com/gin-gonic/gin v1.4.0 github.com/go-redis/redis v6.15.6+incompatible github.com/go-sql-driver/mysql v1.4.1 github.com/golang/protobuf v1.3.2 // indirect github.com/jinzhu/gorm v1.9.11 github.com/json-iterator/go v1.1.7 // indirect github.com/kr/pretty v0.1.0 // indirect github.com/mattn/go-isatty v0.0.10 // indirect github.com/sirupsen/logrus v1.2.0 github.com/ugorji/go v1.1.7 // indirect golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae // indirect gopkg.in/yaml.v2 v2.2.4 )
此時依賴還是沒有下載的
下載依賴
我們需要將依賴下載至本地,而不是使用 go get
go mod download
如果你沒有設置 GOPROXY 為國內鏡像,這步百分百會夯住到死
此時會將依賴全部下載至 GOPATH 下,會在根目錄下生成 go.sum 文件, 該文件是依賴的詳細依賴, 但是我們開頭說了,我們的項目是沒有放到 GOPATH 下的,那么我們下載至 GOPATH 下是無用的,照樣找不到這些包
導入依賴
go mod vendor
執行此命令,會將剛才下載至 GOPATH 下的依賴轉移至該項目根目錄下的 vendor(自動新建) 文件夾下
此時我們就可以使用這些依賴了
GOLAND設置開啟 GO MODULE
可能是因為 GO MODULE 功能還需完善,GOLAND默認是關閉該功能的,我們需要手動打開(不排除之后更新會不會改成默認開啟)
依賴更新
這里的更新不是指版本的更新,而是指引入新依賴
依賴更新請從檢測依賴部分一直執行即可,即
go mod tidy
go mod download
go mod vendor
新增依賴
有同學會問,不使用 go get ,我怎么在項目中加新包呢?
直接項目中 import 這個包,之后更新依賴即可
在協作中使用 GOMODULE
要注意的是, 在項目管理中,如使用git,請將 vendor 文件夾放入白名單,不然項目中帶上包體積會很大
git設置白名單方式為在git托管的項目根目錄新建 .gitignore 文件
設置忽略即可.
但是 go.mod 和 go.sum 不要忽略
另一人clone項目后在本地進行依賴更新(同上方依賴更新)即可
GOMODULE常用命令
go mod init # 初始化go.mod go mod tidy # 更新依賴文件 go mod download # 下載依賴文件 go mod vendor # 將依賴轉移至本地的vendor文件 go mod edit # 手動修改依賴文件 go mod graph # 打印依賴圖 go mod verify # 校驗依賴