Go語言的依賴管理 | 青訓營筆記

語言: CN / TW / HK

theme: nico

這是我參與「第五屆青訓營 」伴學筆記創作活動的第 3 天

前言

記錄加入青訓營的每一天的日筆記

背景

開發專案時應學會站在巨人的肩膀上,即有效利用開發元件進行或工具提升自己的研發效率

對於較簡單的單體函式而言,只需要依賴原生的SDK即可完成開發

對於實際開發的工程較於複雜,應將精力投放在實現的業務邏輯之上

  • 工程專案不可能基於標準庫0-1編碼搭建
  • 管理依賴庫

GOPATH 模式

GOPATH為環境變數 包含bin、pkg、src三部分

$GOPATH:專案根路徑

  • src:專案原始碼
  • bin:專案編譯的二進位制檔案 可執行程式
  • pkg:專案編譯的中間產物 加速編譯 第三方依賴包

執行方式:

所有工程程式碼要求放在GOPATH/src目錄下 工程本身也將作為一個依賴包,可以被其它 GOPATH/src 目錄下的工程引用 在 $GOPATH/src下進行 .go 檔案或原始碼的儲存,我們可以稱其為 GOPATH 的模式

缺點:

  • 沒有版本控制的概念
  • 所有專案都要放在$GOPATH/src目錄下,不在當前目錄則不能編譯

GO Vendor模式

解決 GOPATH模式 所有專案都在$GOPATH/src目錄的問題 可以隨處可以建立專案,不用扎堆 src 目錄下

原理:本地化構建

在每個專案下都建立一個vendor目錄,每個專案所需要的以來都會下載到自己的vendor目錄下。在使用包時,會先從當前專案下的vendor目錄查詢,然後再從GOPATH中查詢,都沒有找到最後才在GOROOT中查詢(依賴定址方式:vendor -> GOPATH)

缺點:

  • 放棄了依賴重用,使得冗餘度上升
  • 無法控制依賴的版本 更新專案可能出現依賴衝突 導致編譯出錯

Go Module模式

1.16版本後預設開啟的模式

通過go.mod檔案管理依賴的版本

通過go get/go mod指令工具管理依賴包

工程不用全放在gopath/src目錄下

定義版本規則和管理專案依賴關係

主要改動:

  • GO MODULE模式下所有依賴的包存放在$GOPATH/pkg/mod目錄下
  • 專案中需要有go.mod檔案,來應用$GOPATH/pkg/mod

依賴管理三要素

  • 配置檔案 描述依賴 go.mod
  • 中心倉庫管理依賴庫 Proxy
  • 本地工具 go get/mod

依賴配置 go.mod

module example.com/foobar ​ go 1.16 ​ require (    example.com/apple v0.1.2    example.com/banana v1.2.3    example.com/banana/v2 v2.3.4    example.com/pineapple v0.0.0-20190924185754-1b0db40df49a ) ​ exclude example.com/banana v1.2.4 replace example.com/apple v0.1.2 => example.com/rda v0.1.0 replace example.com/banana => example.com/hugebanana

go.mod 是啟用了 Go moduels 的專案所必須的最重要的檔案,它描述了當前專案(也就是當前模組)的元資訊,每一行都以一個動詞開頭,目前有以下 5 個動詞:

  • module:用於定義當前專案的模組路徑。
  • go:用於設定預期的 Go 版本。
  • require:用於設定一個特定的模組版本。
  • exclude:用於從使用中排除一個特定的模組版本。
  • replace:用於將一個模組版本替換為另外一個模組版本。

這裡的填寫格式基本為包引用路徑+版本號,另外比較特殊的是 go $version,目前從 Go1.16 的程式碼裡來看,還只是個標識作用,暫時未知未來是否有更大的作用。

go mod命令

常用的go mod命令如下:

go mod download    下載依賴的module到本地cache(預設為$GOPATH/pkg/mod目錄) go mod edit        編輯go.mod檔案 go mod graph       列印模組依賴圖 go mod init        初始化當前資料夾, 建立go.mod檔案 go mod tidy        增加缺少的module,刪除無用的module go mod vendor      將依賴複製到vendor下 go mod verify      校驗依賴 go mod why         解釋為什麼需要依賴

go get命令

在專案中執行go get命令可以下載依賴包,並且還可以指定下載的版本。

  • 執行go get -u將會升級到最新的次要版本或者修訂版本(x.y.z, z是修訂版本號, y是次要版本號)
  • 執行go get -u=patch將會升級到最新的修訂版本
  • 執行go get package@version將會升級到指定的版本號version 如果下載所有依賴可以使用go mod download命令。

快速使用go module

  • SET GOPROXY=http://goproxy.cn (這是win環境下的) export GOPROXY=http://goproxy.cn (這是mac環境下的)
  • go mod init [包名] // 初始化專案(如果你是初始化專案直接 go mod init 就好了)
  • 在目錄檔案下會生成go.mod和go.sum檔案 go.mod 裡面包含了所有的包!
  • 在檔案裡面引入包名的時候有的編輯器會報錯但是是可以正常編譯的
  • 下載包使用go get
  • 修改包的版本號直接去go.mod檔案修改然後go mod download

小結

今天學習到的內容還需要進一步的消化,我也是打算將併發程式設計這一塊的內容熟悉透徹了再進行下一部分的課程學習。如果筆記中有錯誤的地方也希望掘友們可以及時的提出糾正。