略微加速

略速 - 互联网笔记

GoPath转go mod

2021-03-31 leiting (2165阅读)

标签 Golang

网上很多go mod 的使用都是重新在go path目录外新建了项目,但是往往我们用的时候以有项目,所以在gopath的src目录下尝试了一下,遇到了很多坑,现总结如下。

1. 在配置文件中设置 export GO111MODULE=on(.vimrc 或.bash_profile)或直接执行这行语句

GO111MODULE 的取值为 off, on, or auto (默认值)

off: GOPATH mode,查找vendor和GOPATH目录
on:module-aware mode,使用 go module,忽略GOPATH目录
auto:如果当前目录不在$GOPATH 并且 当前目录(或者父目录)下有go.mod文件,则使用 GO111MODULE, 否则仍旧使用 GOPATH mode

若在GoPath目录下配置go mod,则需要手动设置为on

2. 在项目目录下执行 go mod init 名字

出现下面代码表示创建成功

 go: creating new go.mod: module 名字1

若从dep中转到mod,则成功后显示如下

3. 设置网络代理

因为已有的项目中可能会用到golang.org/x的包,若不翻墙则无法执行后续步骤,若无需要可跳过此步。

export http_proxy=socks5://127.0.0.1:1080       
export https_proxy=$http_proxy

export GOPROXY=https://goproxy.io1234

4. 执行 go mod tidy,完成后项目路径下会生成go.mod和go.sum

go mod tidy:检查,删除错误或者不使用的modules,下载没download的package

5. go build

执行成功则表示完成

若出现依赖包未更新的问题,例如

则需要手动更新依赖
首先在go.mod 或 go.sum中找到需要更新的依赖包

go get 依赖包@latest

// go get newgit.op.ksyun.com/golang-vc/models.git@latest123

当我们使用 go build、go test等,Go 会自动更新 go.mod 文件的依赖关系

由于是在go path目录中使用,若不需要使用go mod而是vendor时,执行 go build -mod=vendor
go mudules 版本规则:vX.0.0-yyyymmddhhmmss-abcdefabcdef

vX.Y.Z 是标签版本,go modules是根据标签来确定版本号的。
yyyymmddhhmmss 是时间戳
abcdefabcdef是hash值,我们自己指定版本时只需要制定版本号即可,没有版本tag的则需要找到对应commit的时间和hash值。

go get

首先,go get解析需要新增哪些依赖。可以通过在包名后添加@version或者@branch等方式来取代命令的默认更新行为。如果后缀指定为@none,则表明该依赖应该被移除。

其次,go get会下载、编译、安装指定的包。例如使用go get golang.org/x/perf/cmd/…来更新cmd下的所有子包。

运行 go get -u 将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
运行 go get -u=patch 将会升级到最新的修订版本
运行 go get package@version 将会升级到指定的版本号version
运行go get如果有版本的更改,那么go.mod文件也会更改

    go get -v newgit.op.ksyun.com/golang-vc    # 匹配最新的一个 tag
    go get newgit.op.ksyun.com/golang-vc@latest    # 匹配最新的tag
    go get -v newgit.op.ksyun.com/golang-vc@v1.6.2    # 匹配 v1.6.2
    go get newgit.op.ksyun.com/golang-vc@e3702bed2 # 匹配 v1.6.2
    go get newgit.op.ksyun.com/golang-vc@c856192   # 匹配 c856192
    go get newgit.op.ksyun.com/golang-vc@master    # 匹配 master 分支123456

latest 匹配最新的 tag。
v1.2.6 完整版本的写法。
v1、v1.2 匹配带这个前缀的最新版本,如果最新版是 1.2.7,它们会匹配 1.2.7。
c856192 版本 hash 前缀、分支名、无语义化的标签,在 go.mod 里都会会使用约定写法 v0.0.0-20180517173623-c85619274f5d,也被称作伪版本
参考自:https://www.cnblogs.com/shengulong/p/10798798.html

直接拉取别人工程中的go.mod

进入go.mod,对比版本号是否正确,若修改则在退出后执行go mod tidy

若依赖找不到则go get ,同上

----------------------------------------------分割线----------------------------------------------------------

gopath 与go mod的区别

GOPATH中import包存放在 GOPATH/src 目录下
Go Module功能开启后,下载的包将存放与$GOPATH/pkg/mod路径

后续遇到问题会继续更新。。。


https://blog.csdn.net/weixin_43827144/article/details/89852559


北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3