① 《快學 Go 語言》第 16 課 —— 包管理 GOPATH 和 Vendor
學習 Go 語言的模塊管理功能,從 GOPATH 和 Vendor 機制開始。隨著 Go 語言的發展,模塊管理經歷了三個階段,分別是通過全局的 GOPATH 管理第三方包、通過 Vendor 機制將依賴包局部化,以及最新的 Go Mole 功能。
在模塊管理的初期階段,Go 語言使用全局的 GOPATH 路徑來存放所有第三方依賴包。編譯器在尋找包對象時,會優先檢查 GOPATH 路徑下的文件。通常,用戶會將 GOPATH 設置為 ~/go 目錄。了解三個關鍵子目錄:src、pkg 和 bin,分別存放源代碼、編譯好的包對象和二進制可執行文件。
全局管理的 GOPATH 允許通過網站域名編寫友好的包路徑,使用 go get 指令從 GitHub、gopkg.in 和 golang.org 等網站拉取代碼。此外,Go 語言提供了標準的模塊結構,用戶可以參照現有項目來構建自己的模塊。
編寫第一個模塊時,需要在 GOPATH 中創建相應的目錄結構,並編寫代碼。使用 go get 將模塊提交至 GitHub。通過 go run 命令測試模塊功能,然後使用 go get 更新模塊至 GitHub。值得注意的是,Go 語言不推薦使用相對導入,通常建議採用絕對導入。
若遇到兩個包路徑的結尾相同,Go 語言支持導入語句名稱替換功能來區分。此外,Go 還支持無名導入和匿名導入,但這些用法較少見且不建議使用。
Go 提供了三個指令來管理全局包:go build、go install 和 go get。go build 僅編譯代碼,go install 編譯後安裝包,而 go get 下載並編譯包。在開發過程中,先執行 go build -i 可以加快運行速度。
為了解決不同項目依賴不同版本的第三方包問題,引入了 Vendor 機制。Vendor 目錄將項目依賴的第三方包進行本地化管理,優先在 Vendor 中查找所需包。每個項目都有一個 Vendor 子目錄,形成依賴樹,但實際依賴深度通常較小。使用 Vendor 的限制是不能將依賴暴露到外部,以實現項目間版本隔離。
當需要引入具體版本的第三方包時,可以使用 Go 的依賴管理工具 Dep。Dep 管理項目配置文件 Godep.toml 和 Godep.lock,用於指定依賴規則和版本。初始化項目後,使用 dep ensure 指令確保依賴項與項目配置一致。更新版本或添加新依賴時,可執行相關 dep 命令。
盡管 Dep 工具復雜但使用簡單,它支持下載新依賴、移除不使用的依賴,並確保依賴與配置文件完全匹配。Dep 雖然在 Go 社區中流行,但最終 Go 語言官方推薦使用 Go Mole 作為替代方案。