-
golang在1.11版本中引入了新的包管理工具 go mod
-
類似於maven包管理(多項目公用),而之前的vendor類似於node的node_modules管理(各個項目一份)
-
依賴信息添加到go.mod文件中,依賴版本哈希信息存到go.sum文件中
-
使用go mod時,必須在GOPATH目錄之外新建一個目錄
-
當我們使用 go build、go test 以及 go list 時,Go 會自動更新 go.mod 文件,並且將依賴關系寫入其中
-
go mudules 版本規則,舉例:vX.0.0-yyyymmddhhmmss-abcdefabcdef
- vX.Y.Z 是倉庫打的標簽版本,go modules是根據倉庫標簽來確定版本號的,因此我們發布版本時,需要給我們的倉庫打上一個標簽版本號。
- yyyymmddhhmmss 是時間戳
- abcdefabcdef是hash值,我們自己指定版本時只需要制定版本號即可,沒有版本tag的則需要找到對應commit的時間和hash值。
-
go get
首先,go get解析需要新增哪些依賴。可以通過在包名后添加@version或者@branch等方式來取代命令的默認更新行為。如果后綴指定為@none,則表明該依賴應該被移除。
其次,go get會下載、編譯、安裝指定的包。包的安裝模式也是被允許的,比如使用go get golang.org/x/perf/cmd/..來更新cmd下的所有子包。
- 運行 go get -u 將會升級到最新的次要版本或者修訂版本(x.y.z, z是修訂版本號, y是次要版本號)
- 運行 go get -u=patch 將會升級到最新的修訂版本
- 運行 go get package@version 將會升級到指定的版本號version
- 運行go get如果有版本的更改,那么go.mod文件也會更改
go get -v github.com/gorilla/mux # 匹配最新的一個 tag
go get -v github.com/gorilla/mux@latest # 和上面一樣
go get -v github.com/gorilla/mux@v1.6.2 # 匹配 v1.6.2
go get github.com/gorilla/mux@e3702bed2 # 匹配 v1.6.2
go get github.com/gorilla/mux@c856192 # 匹配 c85619274f5d
go get github.com/gorilla/mux@master # 匹配 master 分支
latest 匹配最新的 tag。
v1.2.6 完整版本的寫法。
v1、v1.2 匹配帶這個前綴的最新版本,如果最新版是 1.2.7,它們會匹配 1.2.7。
c856192 版本 hash 前綴、分支名、無語義化的標簽,在 go.mod 里都會會使用約定寫法 v0.0.0-20180517173623-c85619274f5d,也被稱作偽版本
-
設置 GO111MODULE:可以用環境變量 GO111MODULE 開啟或關閉模塊支持,它有三個可選值:off、on、auto,默認值是 auto。
- GO111MODULE=off 無模塊支持,go 會從 GOPATH 和 vendor 文件夾尋找包。
- GO111MODULE=on 模塊支持,go 會忽略 GOPATH 和 vendor 文件夾,只根據 go.mod 下載依賴。
- GO111MODULE=auto 在 $GOPATH/src 外面且根目錄有 go.mod 文件時,開啟模塊支持。
在使用模塊的時候,GOPATH 是無意義的,不過它還是會把下載的依賴儲存在 $GOPATH/pkg/mod 中,也會把 go install 的結果放在 $GOPATH/bin 中
-
Modules and vendoring
當使用module時,Go命令會完全忽略vendor目錄。為了跟之前Go的依賴管理相兼容,我們可以使用go mod vendor 創建vendor目錄來存儲編譯代碼的依賴包。如果在編譯的時候要使用vendor中的依賴包,需要使用go build -mod=vendor命令。
-
go module設置代理:export GOPROXY=https://goproxy.io
-
go.mod文件
-
module 語句指定包的名字(路徑)
-
require 語句指定的依賴項模塊
-
exclude 語句可以忽略依賴項模塊
-
indirect 表示這個庫是間接引用進來的
-
incompatible 猜測意思:主要版本不兼容
-
replace 語句可以替換依賴項模塊
由於某些已知的原因,並不是所有的package都能成功下載,比如:golang.org下的包。
modules 可以通過在 go.mod 文件中使用 replace 指令替換成github上對應的庫,比如:replace ( golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a => github.com/golang/crypto v0.0.0-20190313024323-a1f597ede03a golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0 )
依賴庫中的replace對你的主go.mod不起作用,比如github.com/smallnest/rpcx的go.mod已經增加了replace,但是你的go.mod雖然require了rpcx的庫,但是沒有設置replace的話, go get還是會訪問golang.org/x
-
-
命令:
- go mod init 初始化module
- go mod edit -require="github.com/gin-gonic/gin@v1.1.4" 可以主動修改 go.md 文件中依賴的版本號
- go mod tidy 自動清理掉不需要的依賴項,同時可以將依賴項更新到當前版本
- go list -m --json all 以json格式顯示所有項目使用的依賴包
- go mod edit -fmt 格式化 go.mod 文件
- go mod vendor 生成 vendor 文件夾,方便利用vendor進行編譯打包
- go get 獲取依賴的特定版本,用來升級和降級依賴。可以自動修改 go.mod 文件,而且依賴的依賴版本號也可能會變。
在 go.mod 中使用 exclude 排除的包,不能 go get 下來 - go build -mod=vendor 使用vendor目錄構建
- go build -mod=readonly 防止隱式修改go.mod,如果遇到有隱式修改的情況會報錯,可以用來測試 go.mod 中的依賴是否整潔,但如果明確調用了go mod、go get 命令則依然會導致 go.mod 文件被修改
- go mod download 命令用於將依賴包緩存到本地Cache起來,類似於maven的.m2/repository。Mod Cache 路徑默認在$GOPATH/pkg 下面:$GOPATH/pkg/mod
- go mod graph 打印模塊依賴圖
- go mod verify 驗證依賴是否正確
- go list -m -u all 來檢查可以升級的package
- go get -u 升級所有依賴
refer to
1、goland
4、Modules