golang 依賴管理從GOPATH到go mod


GOPATH

go 1.6 前,GOPATH作為第三方的依賴目錄。

GOPATH 默認位置~/go(linux, unix, Mac)

臨時GOPATH

export GOPATH=/path/to/dir
export GO111MODULE=off

第三方庫存放位置,GOPATH目錄下的src目錄下,/path/to/dir/src

依賴查找路徑

  1. GOROOT
  2. GOPATH

GOVENDER

go 1.6 版本發布,vender目錄被添加到除GOPATHGOROOT之外的依賴目錄。

依賴查找路徑

  1. 當前目錄中vender目錄下
  2. 向上級查找,直到找到src下的vender目錄
  3. GOROOT
  4. GOPATH

GO MODULE

go 1.8 加入 go mod 作為依賴管理。

特點: 依賴由go命令統一管理,開發者不用關心目錄結構。

go module 解決的問題

  • go代碼能否脫離GOPATH運行

  • 能否處理版本依賴並選擇最兼容的依賴版本

  • 能否使用go工具本地管理依賴項並自定義依賴項版本

Usage

常用命令列表

  • go mod init 初始化模塊,例如 go mod init github.com/wjp2013/hello
  • go build, go test 和其它構建命令會自動為 go.mod 添加新的依賴
  • go get 改依賴關系的所需版本(或添加新的依賴關系)
  • go list -m all 列出當前模塊及其所有依賴項
  • go mod tidy 拉取缺少的模塊,移除不用的模塊

不常用命令

  • go mod download 下載依賴包到本地 cache
  • go mod edit 編輯 go.mod 文件,選項有 -json、-require 和 -exclude,可以使用幫助 go help mod edit
  • go mod graph 打印模塊依賴圖
  • go mod vendor 將依賴復制到 vendor 目錄
  • go mod verify 驗證依賴是否正確
  • go mod why 解釋為什么需要依賴

使用示例

開啟GO111MODULE

Go Modules 是否啟用目前由環境變量 GO111MODULE 控制。

  1. 臨時修改

    export GO111MODULE=off
    
  2. 修改全局變量

    go env -w GO111MODULE=on
    

使用過程

  1. 創建go mod

    go mod init test.com 會在當前目錄下創建一個 go.mod 文件,模塊名為test.com

  2. 生成依賴

    • 方法1: 有了模塊定義,然后執行 go mod tidy 會自動生成依賴,填充 go.mod, go.sum 文件。
    • 方法2: 修改源碼用 import 引入模塊 然后執行 go build, go test 等命令,會更新 go.mod, go.sum 文件。
  3. 更新依賴

    go list -m all 查看當前項目正在使用的 package 版本,然后執行 go get xxx/xxx 來更新指定的 package, 再執行 go test 會自動更新 go.mod 文件。

go mod cache

// 導入buffalo
import "github.com/gobuffalo/buffalo"
// 緩存實際位置
// ==> $GOPATH/src/github.com/gobuffalo/buffalo

語義版本

每個語義版本都采用v主版本號.次版本號.修訂版本號

  • v 所有版本號都以v開頭

  • 主版本號 如果主版本號更新,將意味着API版本不再向下兼容

  • 次版本號 增加了新特性,並且向下兼容

  • 修訂版本號 向下兼容的bug修復

go mod的版本選擇

最低版本選擇 選擇項目中最合適的最低版本

示例

A -> D v1.0.1
               ==> D v1.0.2
B -> D v1.0.2

項目依賴模塊A、B,模塊A依賴模塊D_v1.0.1,模塊B依賴模塊D_v1.0.2;根據最小版本規則,則選擇最終D的版本為v1.0.2;

此時,如果刪除模塊B,則不再依賴Dv1.0.2,但v1.0.2 不會降級到v1.0.1;因為此時的A在Dv1.0.2下可以運行。

大版本升級導致包導入格式的變化

當大版本升級時,包的導入需要帶上版本號,原因是大版本升級了,API不兼容,因此修改導入的格式也就比較正常了。

// 版本升級到 v2.3.4

// old
import "github.com/PoplarYang/golib"
// 升級后
import "github.com/PoplarYang/golib/v2"

升級依賴項

>$ go list -m -versions github.com/gin-gonic/gin
// 將會列出 Gin 版本歷史
github.com/gin-gonic/gin v1.1.1 v1.1.2 v1.1.3 v1.1.4 v1.3.0

將版本更新到上個版本,這里只是個演示。

>$ go get github.com/gin-gonic/gin@v1.1.4 // 只需要在依賴后面加上 @version 就可以了
>$ go list -m all
// 看到了版本變化
github.com/gin-gonic/gin v1.1.4

或者可以使用 go mod 來進行版本的切換,這樣就需要兩個步驟了:

>$ go mod edit -require="github.com/gin-gonic/gin@v1.1.4" // 修改 go.mod 文件
>$ go mod tidy //下載更新依賴

或者直接修改go.mod文件,然后執行go mod tidy

// go.mod 方式
require github.com/gobuffalo/buffalo latest    --> 最新版
require github.com/gobuffalo/buffalo version   --> 指定版本
require github.com/gobuffalo/buffalo commit_id --> 指定commit_id

Go 國內加速鏡像

國內網絡訪問國外資源經常會出現不穩定的情況。因此設置 CDN 加速代理就很有必要了,以下是幾個速度不錯的提供者:

使用方法

# 啟用 Go Modules 功能
go env -w GO111MODULE=on

# 配置 GOPROXY 環境變量
go env -w  GOPROXY=xxxx

Refer: Go module


免責聲明!

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



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