NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
### 实践建议 ### 0,go mod 要求所有依赖的 import path 的path 以域名开头,如果现有项目转1.13的go mod 模式,且不是以域名开头则需要修改。 ~~~text eg: code.be.mingbai.com/tools/any_test_del_free ~~~ ### 1, 既然已经更新到1.13了,建议直接设置GO111MODULE="on" ,即开启go mod 模式。因为这也是以后的主流,path会慢慢的消失。 ~~~text go env -w GO111MODULE=on ~~~ ### 2,给go mod 设置代理, 并添加私有域名 ~~~text go env -w GOPROXY=http://goproxy.cn,direct go env -w GOPRIVATE=*.mingbai.com ~~~ 私有域名的配置会让go mod 不走代理,而是用版本控制工具(git)的方式去拉去依赖。解决拉内网或者本地代码的问题。 **3,新建项目,或者是已有项目转为go mod 模式的 init 建议** ~~~text 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)](https://link.zhihu.com/?target=http%3A//%25E6%25AF%2594%25E5%25A6%2582code.be.mingbai.com/tools/soa%25EF%25BC%2589)的严格模式。如果不是可以改为这种模式再试一下。 如果仅一两处报错,还有可能是所引用的包有问题,建议检查包的目录结构。 如果是已有项目升级到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](https://link.zhihu.com/?target=http%3A//%25E6%25AF%2594%25E5%25A6%2582code.be.mingbai.com/tools/soa) 即使是本项目下的其他包 如果无法使用域名,可以考虑使用replace,但不建议这样做。 ~~~text 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。 ~~~text eg: go get code.be.mingbai.com/tools/soa@master ~~~ @分支名,或者commitId等 ### 4,sdk项目维护方发版,使 sdk 的v2、v3 版本 可用于go1.13 mod 模式的显式依赖 注意: 不使用以下两种发版方式,也可以依赖到v1 以上版本,不过需要通过分支名或者commitId 去引入依赖 ~~~text 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 中写入相应的版本号:** ~~~text $ 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 这个文件。** ~~~text $ 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 ├── Learning tracker ├── sensitive_words.go ├── sensitive_words_test.go ├── sensor.go └── v3 ├── go.mod ├── linked_sensor.go ├── Learning tracker ├── sensitive_words.go ├── sensitive_words_test.go └── sensor.go ~~~ 此时使用方的依赖引入: ~~~text 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" # 这一行 ) ~~~