go1.13 mod 實踐和常見問題


實踐建議

0,go mod 要求所有依賴的 import path 的path 以域名開頭,如果現有項目轉1.13的go mod 模式,且不是以域名開頭則需要修改。
 eg: code.be.mingbai.com/tools/any_test_del_free
1, 既然已經更新到1.13了,建議直接設置GO111MODULE="on" ,即開啟go mod 模式。因為這也是以后的主流,path會慢慢的消失。
go env -w GO111MODULE=on
2,給go mod 設置代理, 並添加私有域名
go env -w GOPROXY=http://goproxy.cn,direct

go env -w GOPRIVATE=*.mingbai.com

私有域名的配置會讓go mod 不走代理,而是用版本控制工具(git)的方式去拉去依賴。解決拉內網或者本地代碼的問題。
3,新建項目,或者是已有項目轉為go mod 模式的 init 建議

go mod init 域名/組名/項目名

eg: code.be.mingbai.com/tools/any_test_del_free

4,sdk 發布v2、v3 等版本,使其可用於1.13模式的依賴
參看 常見問題 第4條。

常見問題

1,報錯: XXXX found,but does not contain package XXXX
如果不止一處報錯,可以檢查下 go mod init ‘name’ , 的name 是否為 域名/組名/項目名(比如code.be.mingbai.com/tools/soa) 的嚴格模式。如果不是可以改為這種模式再試一下。

如果僅一兩處報錯,還有可能是所引用的包有問題,建議檢查包的目錄結構。

如果是已有項目升級到go1.13,還有可能是新依賴包的的版本大范圍不對。從現有的依賴文件里(比如glide.lock)導入依賴版本可以解決。
2, 報錯: malformed module path "XXXX": missing dot in first path element
go1.13  mod 要求import 后面的path 第一個元素,符合域名規范,比如code.be.mingbai.com/tools/soa

即使是本項目下的其他包

如果無法使用域名,可以考慮使用replace,但不建議這樣做。

eg: replace  code.be.mingbai.com/tools/soa  =>  ../../tools/soa
3,報錯: require XXXX: version "v3.2.1" invalid: module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v3
其他包,go1.13,對import有嚴格的語義要求,導入依賴包的V2或再v2之后的版本,需要在‘import path’ 的path 包好 ‘/v2’ 等字樣。

更改import path 后 ,go get 並指定版本如果仍然會報錯,執行go mod tidy 會自動更新。(報錯原因,有待進一步確認)

如果所依賴的包,沒有提供這種依賴方式,可以指定依賴master的最新commit。

eg: go get  code.be.mingbai.com/tools/soa@master

    @分支名,或者commitId等
4,sdk項目維護方發版,使 sdk 的v2、v3 版本 可用於go1.13 mod 模式的顯式依賴

注意: 不使用以下兩種發版方式,也可以依賴到v1 以上版本,不過需要通過分支名或者commitId 去引入依賴

eg: go get code.be.mingbai.com/tools/any_test_del_free@c92ca0db

     go get code.be.mingbai.com/tools/any_test_del_free@master

顯式的兩種方式

1,可以直接打標簽,發布包新版本和其它包管理工具基本一致,不過打標簽之前需要在 go.mod 中寫入相應的版本號:
$ go mod edit --module=code.be.mingbai.com/tools/any_test_del_free/v2
 
$ cat go.mod
module code.be.mingbai.com/tools/any_test_del_free/v2
 
go 1.13
 
.......
 
 
 
 
# 此時使用方的依賴引入:
import (
   "code.be.mingbai.com/tools/any_test_del_free/v2/xlog" # 這一行
   sw "code.be.mingbai.com/tools/any_test_del_free/xsensitive_words"
)

官方推薦將上述過程在一個新分支來避免混淆,那么類如上述例子可以創建一個 v2 分支,但這個不是強制要求的。

2,還有一種方式發布新版本,那就是在主線版本種加入 v2 文件夾,相應的也需要內置 go.mod 這個文件。
$ mkdri v3
$ .....coding......
$ go mod intit code.be.mingbai.com/tools/any_test_del_free/xsensitive_words/v3
$ go mod tidy
$cat go.mod
 
 

module code.be.mingbai.com/tools/any_test_del_free/xsensitive_words/v3

go 1.13
......

 
 
 
 
$ .......commit, push and so no....
$ tree projectPath.
├── linked_sensor.go
├── README.md
├── sensitive_words.go
├── sensitive_words_test.go
├── sensor.go
└── v3
    ├── go.mod
    ├── linked_sensor.go
    ├── README.md
    ├── sensitive_words.go
    ├── sensitive_words_test.go
    └── sensor.go
 
 
# 此時使用方的依賴引入:
import (
   "code.be.mingbai.com/tools/any_test_del_free/v2/xlog"
   sw "code.be.mingbai.com/tools/any_test_del_free/xsensitive_words/v3" # 這一行
)

```


免責聲明!

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



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