天天看點

依賴管理系統 go modules

  • 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 [email protected] 将會更新到指定的版本号version
    • 運作go get如果有版本的更改,那麼go.mod檔案也會更改
go get -v github.com/gorilla/mux    # 比對最新的一個 tag
    go get -v github.com/gorilla/[email protected]    # 和上面一樣
    go get -v github.com/gorilla/[email protected]    # 比對 v1.6.2
    go get github.com/gorilla/[email protected] # 比對 v1.6.2
    go get github.com/gorilla/[email protected]   # 比對 c85619274f5d
    go get github.com/gorilla/[email protected]    # 比對 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上對應的庫,比如:

      go 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/[email protected]" 可以主動修改 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

2、working with go modules

3、go modules詳解

4、Modules

5、Go依賴子產品版本之Module避坑使用詳解

6、跳出Go module的泥潭

7、golang進階:go1.12 mod 教程

轉載于:https://www.cnblogs.com/shengulong/p/10798798.html