實踐建議
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" # 這一行
)
```