前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go老项目迁移module遇到坑总结

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

作者头像
solate
发布2022-06-08 18:04:28
4.2K0
发布2022-06-08 18:04:28
举报
文章被收录于专栏:solate 杂货铺

解决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_test\goa.demo.calculator\vendor\github.com\goadesign\goa\uuid\uuid.go

修改导包

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

一种就使用google uuid ,

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决etcd bbolt 包与 grpc冲突
    • 解决
      • go: go.etcd.io/bboolt@v1.3.6 used for two different module path
        • go.etcd.io/etcd/mvcc/mvccpb".Event_EventType
        • 解决 package xxx is not in GOROOT or GOPATH 本地包
          • 本地包使用示例
            • io/fs : package io/fs is not found
              • ot enough arguments in call to uuid.Must
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档