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/[email protected]

    @分支名,或者commitId等
4,sdk项目维护方发版,使 sdk 的v2、v3 版本 可用于go1.13 mod 模式的显式依赖

注意: 不使用以下两种发版方式,也可以依赖到v1 以上版本,不过需要通过分支名或者commitId 去引入依赖

eg: go get code.be.mingbai.com/tools/[email protected]

     go get code.be.mingbai.com/tools/[email protected]

显式的两种方式

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" # 这一行
)

```

原文地址:https://www.cnblogs.com/mingbai/p/go13moduleuser.html

时间: 2024-11-10 10:20:11

go1.13 mod 实践和常见问题的相关文章

Java日志设计&实践(1) - 常见问题

日常开发.运维过程中经常会碰到以下几个问题: 什么情况下需要输出日志? 已明确需要输出日志时,如何选择日志级别? 已明确需要输出日志时,日志中需要输出哪些东东? 一个Tomcat加载多个工程,如何确定日志中的内容是哪个工程的? 多个Tomcat同时加载同一个工程,可以使用log4j的DailyRollingFileAppender等文件类Appender吗? 多个Tomcat同时加载同一个工程,可以分别指定日志输出目录吗? 日志中的中文乱码怎么办? 可以动态调整一个类的日志级别吗? 一天日志文件

RabbitMQ3.7.13 安装实践

Windows 安装 rabbitmq-server-3.7.13 原文地址:https://www.cnblogs.com/RHadoop-Hive/p/10562497.html

SQLite多线程读写实践及常见问题总结

基本操作的部分,大家都很熟悉了,这里根据个人切身经验,总结了一些经常遇到的,也需要注意的一些问题,与大家分享,水平有限,不妥或者错误的地方还望指出. 多线程读写 SQLite实质上是将数据写入一个文件,通常情况下,在应用的包名下面都能找到xxx.db的文件,拥有root权限的手机,可以通过adb shell,看到data/data/packagename/databases/xxx.db这样的文件. 我们可以得知SQLite是文件级别的锁:多个线程可以同时读,但是同时只能有一个线程写.Andro

python编程快速上手之第13章实践项目参考答案(13.6.1)

import os,PyPDF2 os.chdir('D:\\My Documents') for folderName, subfolders, filenames in os.walk('D:\\My Documents'): for file in filenames: if file.endswith('.pdf'): pdfFile = open(file, 'rb') pdfReader = PyPDF2.PdfFileReader(pdfFile) pdfWriter = PyPD

python编程快速上手之第13章实践项目参考答案(13.6.2)

#! python3 # encoding: UTF-8 import os import docx from docx import Document from docx.shared import Pt from docx.shared import Inches os.chdir('C:\\Users\\Administrator\\Python35-32') doc = docx.Document('InvitationLetter.docx') guests = open('guest

python编程快速上手之第13章实践项目参考答案(13.6.3)

import os,PyPDF2 os.chdir('C:\\Users\\Administrator\\Python35-32') dict=open('C:\\Users\\Administrator\\Python35-32\\dictionary.txt')#读入字典 pdfReader = PyPDF2.PdfFileReader(open('encryptedminutes.pdf', 'rb'))#读入PDF文件 for n in dict.readlines(): # print

个人安装GO1.13.6版本指南手册之搭建环境

因好奇而走进go语言,让你不在只闻其声,不见其形. https://golang.org/doc/install:这里是go语言的官网文档.吃不透英文,终究会被限制在有限的区域,一词词的吃透. 安装包下载地址为:https://golang.org/dl/. 如果打不开可以使用这个地址:https://golang.google.cn/dl/.https://golang.google.cn/doc/install. 想了想,具体步骤就不提了,英文内容够全了. 说一下关于SettingGOPAT

golang1.13中重要的新特新

本文索引 语言变化 数字字面量 越界索引报错的完善 工具链改进 GOPROXY GOSUMDB GOPRIVATE 标准库的新功能 判断变量是否为0值 错误处理的革新 Unwrap Is As golang1.13发布已经有一个月了,本文将会列举其中几个较为重要的特性.我们将会从语言变化.库变化以及工具链的改进这三方面逐个介绍新版本中引入的新特性. 语言变化 go团队一直承诺1.x版本的向前兼容,所以虽然1.13作为第一个开始向go2过渡的版本,其引入的语言变化是极少的,主要只有这两点:更多的数

阿里云CentOS服务器下安装Golang1.13并配置代理

下载到/usr/local位置并解压 cd /usr/local wget https://studygolang.com/dl/golang/go1.13.linux-amd64.tar.gz tar -xzvf go1.13.linux-amd64.tar.gz 在$HOME位置创建go工作目录 cd mkdir go 配置环境变量并设置代理 vim /etc/profile export PATH=$PATH:/usr/local/go/bin export GOPATH=$HOME/go