Go modules 是 Go 語⾔的依賴解決⽅案,發布於 Go1.11,成⻓於 Go1.12,豐富於 Go1.13,正式於 Go1.14 推薦在⽣產上使⽤。
解決了什么問題 ?
Go 語⾔⻓久以來的依賴管理問題。
“淘汰”現有的 GOPATH 的使⽤模式。
統⼀社區中的其它的依賴管理⼯具(提供遷移功能)。
GOPATH的⼯作模式
GOPATH的弊端 :⽆版本控制概念 ⽆法同步⼀致第三⽅版本號 ⽆法指定當前項⽬引⽤的第三⽅版本號
Go Modules模式
go mod命令
go mod init ⽣成 go.mod ⽂件
go mod download 下載 go.mod ⽂件中指明的所有依賴
go mod tidy 整理現有的依賴
go mod graph 查看現有的依賴結構
go mod edit 編輯 go.mod ⽂件
go mod vendor 導出項⽬所有的依賴到vendor⽬錄
go mod verify 校驗⼀個模塊是否被篡改過
go mod why 查看為什么需要依賴某模塊
go mod 環境變量
GO111MODULE 是否開啟go modules模式 建議go V1.11之后,都設置為on
GOPROXY 項⽬的第三⽅依賴庫的下載源地址 建議設置國內的地址 阿⾥雲 https://mirrors.aliyun.com/goproxy/ 七⽜雲 https://goproxy.cn,direct
direct ⽤於指示 Go 回源到模塊版本的源地址去抓取(⽐如 GitHub 等)
GOSUMDB ⽤來校驗拉取的第三⽅庫是否是完整的 默認也是國外的⽹站,如果設置了GOPROXY,這個就不⽤設置了
GONOPROXY 通過設置GOPRIVATE即可
GONOSUMDB 通過設置GOPRIVATE即可
GOPRIVATE 通過設置GOPRIVATE即可
go env -w GOPRIVATE="git.example.com,github.com/aceld/zinx 表示git.example.com 和 github.com/aceld/zinx 是私有倉庫,不會進⾏GOPROXY下載和校驗
go evn -w GOPRIVATE="*.example.com" 表示所有模塊路徑為example.com的⼦域名,⽐如 git.example.com 或者 hello.example.com 都不進⾏ GOPROXY下載和校驗
通過 go env來查看環境變量 go env -w GO111MODULE=on 或者通過 Linux export 環境⽅式也可以
使⽤Go Modules初始化項⽬
1 開啟Go Modules模塊 保證GO111MODULE=on
go env -w GO111MODULE=on
export GO111MODULE=on 設置在⽤戶啟動腳本中 需要重新打開終端或者執⾏source ~/.bashrc
2 初始化項⽬
(1)任意⽂件夾創建⼀個項⽬(不要求在$GOPATH/src) mkdir -p $HOME/aceld/modules_test
(2)創建go.mod⽂件,同時起當前項⽬的模塊名稱 go mod init github.com/aceld/module_test
就會⽣成⼀個go mod⽂件
module github.com/aceld/moudles_test go 1.14
在該項⽬編寫源代碼
如果源代碼中依賴某個庫(⽐如: github.com/aceld/zinx/znet)
⼿動down go get github.com/aceld/zinx/znet
⾃動down
(3)go mod ⽂件會添加⼀⾏新代碼
module github.com/aceld/moudles_test go 1.14 require github.com/aceld/zinx v0.0.0-20200315073925-f09df55dc746 // indirect
含義當前模塊依賴github.com/aceld/zinx
依賴的版本是 v0.0.0-20200315073925-f09df55dc746
//indirect 表示間接依賴 因為項⽬直接依賴的是znet包 所以所間接依賴zinx包
(4)會⽣成⼀個go.sum⽂件
github.com/aceld/zinx v0.0.0-20200315073925-f09df55dc746 h1:TturbcEfboY81jsKVSQtGkqk8FN8ag0TmKYzaFHflmQ=
github.com/aceld/zinx v0.0.0-20200315073925-f09df55dc746/go.mod h1:bMiERrPdR8FzpBOo86nhWWmeHJ1cCaqVvWKCGcDVJ5M=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
go.sum⽂件的作⽤ 羅列當前項⽬直接或間接的依賴所有模塊版本,保證今后項⽬依賴的版本不會被篡改
h1:hash 表示整體項⽬的zip⽂件打開之后的全部⽂件的校驗和來⽣成的hash 如果不存在,可能表示依賴的庫可能⽤不上
xxx/go.mod h1:hash go.mod⽂件做的hash
修改項⽬模塊的版本依賴關系
go mod edit -replace=zinx@v0.0.0-20200306023939bc416543ae24=zinx@v0.0.0-20200221135252-8a8954e75100
go mod⽂件就會被修改
module github.com/aceld/modules_test go 1.14 require github.com/aceld/zinx v0.0.0-20200306023939-bc416543ae24 // indirect replace zinx v0.0.0-20200306023939-bc416543ae24 => zinx v0.0.0-20200221135252-8a8954e75100