go mod 怎么导入本地其它项目的包?

发布于 2022-09-11 22:57:19 字数 246 浏览 17 评论 0

go version 1.13.1

在做微服务中使用了 grpc,每个微服务都用了 go mod 模式,因为grpc在创建client时 需要调用在另一个服务里的 pb包。请问怎么导入啊?
QQ20191015-180306@2x.png
如图:这样总是报错无法引入。
谢谢各位

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蹲在坟头点根烟 2022-09-18 22:57:19

最近,遇到不少关于 go mod 的问题,看样子是可以抽时间总结篇文章了。下面的回答可以解决问题,但我也不敢说是最佳实践。

我现在的感觉是,越研究越发现 go.mod 的坑还是挺多的。

说问题吧。

如果想在你的模块如果想引入你本地其他地方的模块,可以尝试通过 replace 指定目录,而且前提是你的 article 也得 go 的一个模块,而不是按 gopath 下的某个包来引入。

我简答举个例子吧,比如现在有两个项目,分别是 blog 和 article,结果如下:

├─article
│      article.go
│      go.mod
│
├─blog
│      go.mod
│      main.go

blog 是应用的入口,main 所在位置,而 article 可以理解为你写的一个公共的库,其中提供了一个函数 Hello()。现在,要在 blog 中调用 article 中的 Hello() 函数。

article 模块中的 go.mod 内容如下:

module article

go 1.13

article.go 内容如下:

package article

func Hello() string {
        return "Hello"
}

blog 模块中的 go.mod 内容如下:

go 1.13

require github.com/article v0.0.0-incompatible

replace github.com/article => ../article

此处的 replace 稍微介绍下,之所以要是 github.com/article 的格式,是因为在 go1.13 中, go module 名称规范要求路径的第一部分必须满足域名规范,否则可能汇报类似 malformed module path "article": missing dot in first path element 这样的错误。当然,在 go1.12 不会有报这个错误。建议的话,如果是公司内部使用,可以替换成公司内部域名。

replace 的第二个参数指定了不从远程获取,而是本地某个路径下的模块替换 github.com/article。

main.go 的内容如下:

package main

import (
        "fmt"

        "github.com/article"
)

func main() {
        fmt.Println("Hello")
        fmt.Println(article.Hello())
}

此时,在 blog 执行 go run main.go 是可以成功运行的。

讽刺将军 2022-09-18 22:57:19

`module books/user-web

go 1.13

require github.com/micro/go-micro v1.18.0

//replace github.com/books/user-srv => /Users/jackluo/works/go/src/books/user-srv
replace books/user-srv => ../user-srv`

我这样写没有问题

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文