依賴管理系統 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 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

2、working with go modules

3、go modules詳解

4、Modules

5、Go依賴模塊版本之Module避坑使用詳解

6、跳出Go module的泥潭

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM