gomod包依賴管理工具使用詳解
前言
作為官方的包依賴管理工具 gomod,已經(jīng)被廣泛的使用于各個開源項目中了。自從有了它,腰不酸手不疼了,敲代碼也更有勁了......o(∩_∩)o 所以,今天我們就來認識認識 gomod ,看看它是如何來解決我們的包管理問題!
gomod 產(chǎn)生背景
在我們開發(fā)程序時,經(jīng)常會引用到第三方開源框架提供的方法。按 Go 以前的做法會先將開源項目的最新代碼通過 go get 下載本地的 GOPATH 目錄。然后在需要使用的時候,就到對應(yīng)的 GOPATH 目錄去查找了。
然而,這里需要考慮一個問題,就是不同時間點 go get 下載下來的代碼可能是不一樣的,因為第三方開源框架總會進行代碼升級,此時不能保證各個開發(fā)者的本地環(huán)境依賴包都是同一個版本。
而這就無形中增加了維護的成本,每次升級得手動刪除,然后重新引用。
特別是在使用 docker 或 k8s 這種需要重新構(gòu)建環(huán)境的發(fā)布方式時, 更得注意這個問題了,因為誰也不知道最新的依賴包修改了哪些內(nèi)容,是否有破壞性變更存在。
此時,就該 go mod 登場了,它通過在 go.mod 這個文件里記錄了當(dāng)前項目里所有依賴包的 git 倉庫地址以及對應(yīng)的版本號,來解決了包依賴管理的問題,后續(xù)在構(gòu)建編譯時,就會根據(jù)對應(yīng)的版本號去拉取依賴包。也就是說只要我們維護了 gomod 文件,依賴問題就不再是問題了?。?!
gomod 文件的創(chuàng)建
命令: go mod init 項目名
比如,我的項目是 manage, 那么就可以這樣使用:
go mod init manage
此時就會在當(dāng)前項目下生成 gomod 文件:
gomod 生成
注意, 如果當(dāng)前的項目是要給外部使用的,最好是配合 git 倉庫命名,比如
go mod init github.com/lincoln/manage
以便其他項目可以 go get 引用得到。
依賴包的版本生成
上面的命令只是生成一個 gomod 文件,至于依賴包的版本號信息暫時是還沒有生成的,可以使用下面 2 個命令進行獲取:
命令1:go get 包名
如果依賴包比較多,那么 go get 就比較麻煩了??梢允褂昧硗庖粋€命令:
命令2:go mod tidy
這個命令將會掃描所有我們 import 到的包,并生成對應(yīng)的記錄到 gomod 文件里。
gomod 使用
此時,我們看到了一條依賴包以及版本號的信息記錄。
這里的 v2.1.0 是因為引用的 go-cache 包在 github 上已經(jīng)打標(biāo)簽了,所以有 v2.1.0 類似的字樣出現(xiàn),后面有 incompatible 是因為 go-cache 包的命名沒有遵循官方規(guī)范,所以加了 incompatible 加以區(qū)分。
如果引用的包沒有打過標(biāo)簽,那就有其他的版本記錄生成規(guī)則, 比如
v0.0.0-20210501091049-10806f459f65
就表示版本號 + 日期 + 主分支最新的 commit 哈希值前綴。
此外,我們還發(fā)現(xiàn)除了 gomod 文件之外,還有 gosum 文件。此文件主要是用來記錄依賴包的 hash 值,防止部署到新環(huán)境時,重新拉取的包與之前本地拉取的包不一致。
gomod 文件的使用技巧
1)引用分支的包
默認情況下,go mod tidy 會拉取主分支的最新代碼作為版本記錄。
如果我們有多個功能在同時開發(fā),按常規(guī)操作,是需要新建各自的 feature 分支來開發(fā)的,而不會在主分支上直接開發(fā)的。
所以,當(dāng)有其他模塊需要引用分支代碼時,我們就不能按常規(guī)操作 go mod tidy 了。
此時我們需要手動修改 gomod 引用包的版本名字,替換為對應(yīng)的分支名,比如 gomod 文件改為:
require github.com/patrickmn/go-cache develop
然后再使用 go mod tidy 命令,Go 就會自動的去獲取 develop 分支的最新代碼了。(注:此處只是演示,并不真實存在 go-cache 的 develop 分支)
2)引用本地開發(fā)的代碼
golang 是根據(jù) gomod 文件來構(gòu)建程序的,如果我們引用了其他項目代碼,那每次就得先提交代碼到 git 倉庫,然后重新構(gòu)建 gomod 文件才能引用到最新的代碼。
為了能直接引用本地正在開發(fā)的包,又不頻繁提交代碼,我們可以使用下面這個命令
replace github.com/patrickmn/go-cache => 本地項目包的地址
這樣就可以在構(gòu)建項目時,本地聯(lián)調(diào)了。等聯(lián)調(diào)完畢,再一次性的提交代碼到 git 倉庫里。
3)查看依賴包的歷史版本
使用 go mod tidy 命令時總會拉取最新版本的依賴包,但當(dāng)我們只想 import 某個歷史版本時,就可以使用下面的命令來獲取歷史版本號了:
go list -m -versions github.com/patrickmn/go-cache
執(zhí)行結(jié)果:
github.com/patrickmn/go-cache v1.0.0 v2.0.0+incompatible v2.1.0+incompatible
然后當(dāng)我們想引用 v1.0.0 時,就可以這樣改寫了:
require github.com/patrickmn/go-cache v1.0.0
需要注意的是,go list
某個包,必須得先在此項目中引用了對應(yīng)的包。例如,當(dāng)前項目如果沒有引用 go-cache 包,則go list
是獲取不到信息的。
go module 其他命令
go list -m all :列出當(dāng)前項目包名以及所有依賴到的包
go mod vendor: 將引用的包都生成到當(dāng)前項目的 vendor 包下,這樣可以不用每次重新構(gòu)建時去拉取對應(yīng)的包,直接加入到自己的 git 代碼倉庫管理中, 直接 git pull 即可。
另外,有點要注意的就是,如果我們在 gomod 文件里手動添加了某個依賴包,但實際在項目里并沒有使用到這個依賴包時,那么在執(zhí)行 go mod tidy 構(gòu)建時,就會自動刪除這個依賴包的相關(guān)記錄。
總結(jié)
go mod 的使用很簡單,go mod init
、go mod tidy
,基本就能解決很多依賴問題了。這也是 Go 官方一直提倡的簡潔、優(yōu)雅。
以上就是gomod如何解決包管理問題使用詳解的詳細內(nèi)容,更多關(guān)于gomod包管理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Go語言中如何通過Goroutine實現(xiàn)高并發(fā)
在Go語言中,并發(fā)編程是一個核心且強大的特性,Go語言通過goroutine和channel等機制,使得并發(fā)編程變得更加簡單和直觀,本文給大家介紹了Go語言中如何通過Goroutine快速實現(xiàn)高并發(fā),感興趣的小伙伴跟著小編一起來看看吧2024-10-10使用dep 配置golang 開發(fā)環(huán)境的操作方法
下面小編就為大家?guī)硪黄褂胐ep 配置golang 開發(fā)環(huán)境的操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09Golang運行報錯找不到包:package?xxx?is?not?in?GOROOT的解決過程
這篇文章主要給大家介紹了關(guān)于Golang運行報錯找不到包:package?xxx?is?not?in?GOROOT的解決過程,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-07-07golang?recover函數(shù)使用中的一些坑解析
這篇文章主要為大家介紹了golang?recover函數(shù)使用中的一些坑解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02協(xié)同開發(fā)巧用gitignore中間件避免網(wǎng)絡(luò)請求攜帶登錄信息
這篇文章主要為大家介紹了協(xié)同開發(fā)巧用gitignore中間件避免網(wǎng)絡(luò)請求攜帶登錄信息2022-06-06