Go語言從入門到規範-4.2、使用go module解決本地包需要go get的問題
文章目錄
- Go語言從入門到規範-4.2、使用go module解決本地包需要go get的問題
-
- 1、前言
- 2、官方部落格
- 3、replace替換導入本地包
- 4、示例和處理步驟
- 5、最後
1、前言
最近在使用子產品間調用時發現了一個問題,我們按照GitHub、gitee、gitlab進行src目錄劃分後,GitHub的依賴包通過go get下載下傳這樣沒啥問題,gitee下載下傳時私有倉庫出現了問題,暫時沒有深究通過public方式繞過了,但是gitlab我們通常還沒有将代碼上傳到倉庫中,隻是我本地進行子產品間的調用,但是編譯時卻提示找不到包,需要go get來添加對應的包,但是實際上我根本就沒有送出,這就麻煩了,我不可能為了go get将沒有測試過的包送出到倉庫,于是就找了一下如何導入本地包進行測試,這裡做下總結,實際我們在使用時利用go.mod的方式也是比較規範的官方推薦的管理包依賴的方式。
2、官方部落格
這個是官方對應go module是的一個部落格:
https://blog.golang.org/using-go-modules
通過通看可以了解到go module的一些基本用法和作用:
Go子產品是Go中依賴管理的未來。現在,所有受支援的Go版本(即Go 1.11和Go 1.12)都提供子產品功能。
這篇文章使用Go子產品介紹了這些工作流程:
- go mod init建立一個新子產品,初始化go.mod描述它的檔案。
- go build,go test以及其他程式包建構指令go.mod根據需要向其中添加新的依賴項。
- go list -m all 列印目前子產品的依賴項。
- go get 更改所需版本的依賴項(或添加新的依賴項)。
- go mod tidy 删除未使用的依賴項。
3、replace替換導入本地包
上面的文章可以讓我們了解到go module機制的概念和用法,我們可以了解到go鼓勵我們在本地也加入go.mod和go.sum來進行子產品依賴管理,是以我們嘗試使用這種方式來管理我們的子產品以及解決不同子產品間的依賴調用問題。
不管是本地還是遠端的包,我們在使用時都通過import來導入,這對于遠端包沒有什麼問題,編譯時會自動從遠端進行下載下傳,但是就像我在最開始提到的問題,我本地存在,但是遠端還沒有,如果自動去遠端下載下傳肯定會報錯,這時我們生成的go.mod中對于required的包的路徑需要修改成本地的,go使用replace來更加相容這種情況,當我們使用本地包時我們可以使用replace來将遠端路徑替換成本地路徑,當我們測試通過後可以使用遠端路徑時則删除replace即可。
這裡是官方提供的go mod所有相關的内容,其中就包含了replace指令的介紹(如果有必要的話可以全部看一下):
https://golang.org/ref/mod
這個是找到的一個比較詳細的介紹如何使用replace進行本地包導入的部落格:
https://www.liwenzhou.com/posts/Go/import_local_package_in_go_module/
4、示例和處理步驟
這裡給個go.mod的本地示例:
module gitlab.com/xiaoyaoyou/devctl
go 1.16
require (
google.golang.org/grpc v1.37.0
gitlab.com/xiyaoyou/tsldevice v0.0.0-00010101000000-000000000000
)
replace gitlab.com/xiaoyaoyou/tsldevice => ../tsldevice
一般生成和修改go.mod的步驟:
- 1、go mod init根據提示處理
- 2、go mod tidy一般根據上述步驟會提示執行這一步
- 3、編譯子產品
- 4、根據編譯子產品的提示進行go get,一般編譯時會提示所依賴的子產品沒有,需要添加:no required module provides package xxx; to add it: go get xxx
- 5、運作各個go get xxx,這時go.mod會更新
- 6、修改需要replace的包路徑,比如我上面的gitlab相關的包,replace為本地相對路徑即可
- 7、重新編譯
- 8、如果還是提示gitlab相關内容沒有則再次執行go get xxx,在有replace的情況下會自動添加,比如:
$go get gitlab.com/zhengyao/tsldevice
go get: added gitlab.com/xiaoyaoyou/tsldevice v0.0.0-00010101000000-000000000000
- 9、如果還是不行則手動添加required和replace的内容,當我們沒有設定包版本時為v0.0.0,即:
module gitlab.com/zhengyao/goonvif/cmdtest
go 1.16
require gitlab.com/xxx/client v0.0.0
replace gitlab.com/xxx/client => ../client
5、最後
其實replace也可用在當我們沒有代理擷取go包時通過replace方式替換google的一些包路徑為GitHub的包路徑,因為go是開源的,是以google的官方包都是有GitHub位址的,而GitHub位址大多情況下是沒有被牆的。