go老项目迁移module遇到坑总结

2022-06-08 18:04:28 浏览数 (1)

解决etcd bbolt 包与 grpc冲突

解决go mod拉取etcd依赖包报错的问题

go mod管理依赖包中有etcd时会出现异常报错:

代码语言:javascript复制
go: dse/pkg/component/cache imports
        go.etcd.io/etcd/clientv3 tested by
        go.etcd.io/etcd/clientv3.test imports
        github.com/coreos/etcd/auth imports
        github.com/coreos/etcd/mvcc/backend imports
        github.com/coreos/bbolt: github.com/coreos/bbolt@v1.3.6: parsing go.mod:
        module declares its path as: go.etcd.io/bbolt
                but was required as: github.com/coreos/bbolt

原因主要是etcd中使用的bbolt和grpc版本冲突引起

解决

删除原go.mod和go.sum

注意: 这里记得版本要是v1.2.3格式的,一开始忘记v直接写版本号1.3.6导致错误。

代码语言:javascript复制
go mod init
go mod edit -replace github.com/coreos/bbolt@v1.3.6=go.etcd.io/bbolt@v1.3.6
go mod tidy

或者直接修改go.mod

代码语言:javascript复制
replace github.com/coreos/bbolt v1.3.6 => go.etcd.io/bbolt v1.3.6

上面链接是修改了etcd和grpc两项,我这只修改etcd就不报错了。下面是链接的修改方式:

代码语言:javascript复制
go mod init
go mod edit -replace github.com/coreos/bbolt@v1.3.4=go.etcd.io/bbolt@v1.3.4
go mod edit -replace google.golang.org/grpc@v1.29.1=google.golang.org/grpc@v1.26.0
go mod tidy

go: go.etcd.io/bboolt@v1.3.6 used for two different module path

Go mod 常见问题

  1. module declares its path as

这需要用到 go mod 的 replace 来调整,具体就是往 go.mod 插入一条记录。

代码语言:javascript复制
replace github.com/coreos/bbolt v1.3.4 => go.etcd.io/bbolt v1.3.4
  1. used for two different module paths

很神奇,replace 两次就好了,具体原因待排查。

代码语言:javascript复制
go mod edit -replace=go.etcd.io/bbolt@v1.3.4=github.com/coreos/bbolt@v1.3.4

其实就会在 go.mod 文件插入两行。

代码语言:javascript复制
replace github.com/coreos/bbolt v1.3.4 => go.etcd.io/bbolt v1.3.4
replace go.etcd.io/bbolt v1.3.4 => github.com/coreos/bbolt v1.3.4

不得不吐槽一下etcd 使用坑是真的多。

go.etcd.io/etcd/mvcc/mvccpb".Event_EventType

go1.13 使用Etcd的问题

etcd报错

代码语言:javascript复制
invalid operation: ev.Type == "go.etcd.io/etcd/mvcc/mvccpb".DELETE 
(mismatched types "github.com/coreos/etcd/mvcc/mvccpb".Event_EventType 
and "go.etcd.io/etcd/mvcc/mvccpb".Event_EventType)

invalid operation: ev.Type == "go.etcd.io/etcd/mvcc/mvccpb".PUT
 (mismatched types "github.com/coreos/etcd/mvcc/mvccpb".Event_EventType 
and "go.etcd.io/etcd/mvcc/mvccpb".Event_EventType)

go run 运行的时候报错, 解决方法是修改自己代码引入的包

代码语言:javascript复制
import 的 go.etcd.io/etcd/clientv3 引用的是 go.etcd.io/etcd/mvcc/mvccpb, 
但是在  
(if ev.Type == mvccpb.DELETE) 和
(if ev.Type == mvccpb.PUT && string(ev.Kv.Key) == key)
应用了 github.com/coreos/etcd/mvcc/mvccpb

自己代码里全部改成 github.com/coreos/etcd/mvcc/mvccpb

解决 package xxx is not in GOROOT or GOPATH 本地包

报错package xxx is not in GOROOT or GOPATH 或者 cannot find package “xxx“ in any of

我要迁移,肯定是要开GO111MODULE="on" 这种方式

本地包使用示例

使用go module导入本地包

随便找个文件夹创建work文件夹,同层创建demo和utils文件夹,在demo中再创建modol文件夹

modol.go

代码语言:javascript复制
package modol

import "fmt"

func Hello(str string)  {
	fmt.Println("model hello: ", str)
}

utils.go

代码语言:javascript复制
package utils

import "fmt"

func SayHello(str string) string {
	fmt.Println("utils SyaHello")
	return fmt.Sprintf("Hello: %s", str)
}

现在我们要在main.go中使用自己项目下的包modol,以及使用同层级的utils包。

  1. 首先初始化utils里的go.mod文件
代码语言:javascript复制
go mod init utils

内容为

代码语言:javascript复制
module utils

go 1.18
  1. 同样初始化demo:
代码语言:javascript复制
go mod init demo

这个时候demo/modol包就已可以使用,但是同层级的utils还不能用

  1. 使用replace指令定义本地包,

demo/go.mod

代码语言:javascript复制
module demo

go 1.18

require "utils" v0.0.0
replace "utils" => "../utils"

定义uilts包版本,然后定义引用路径

  1. 最后在main.go中使用
代码语言:javascript复制
package main

import (
	"fmt"
	"demo/modol"
	"utils"
)

func main() {
	fmt.Println("Hello Main")
	modol.Hello("xx")
	utils.SayHello("Tom")
}


// Hello Main
// model hello:  xx
// utils SyaHello

本项目下包使用定义的module名字/包名(demo/modol)

同层包需要自定义包名和路径。

io/fs : package io/fs is not found

io/fs is not in GOROOT

git 上下载的包报这个错

原因是本地使用的go版本是go1.15.2 需要升级到go1.17解决问题。

ot enough arguments in call to uuid.Must

golang not enough arguments in call to uuid.Must

satori/go.uuid作者提交了个更新,方法参数有变化,导致调用不了

一种是使用这个替换版本 https://github.com/gofrs/uuid, 修改vendor

如D:go_workspace_testgoa.demo.calculatorvendorgithub.comgoadesigngoauuiduuid.go

修改导包

代码语言:javascript复制
import uuid "github.com/gofrs/uuid"
//import uuid "github.com/satori/go.uuid"

一种就使用google uuid ,

0 人点赞