Golang Go语言中关于 go mod 引用本地其他项目的问题

发布于 1周前 作者 ionicwang 来自 Go语言

Golang Go语言中关于 go mod 引用本地其他项目的问题

今天升级了一下 go-micro,发现一堆错误,看别人的回复是 go-micro 开始启用了 go mod 了。export GO111MODULE=on

于是我尝试之后,一直没太明白怎么解决导入本地项目的问题。

build command-line-arguments: cannot load common/systemcall: malformed module path "common/systemcall": missing dot in first path element

官方说是 import 前面必须要有.(例如 example.com ),因为自己把一些文件放到公共库项目了( common 模块,这个现在在 GOPATH 下面),多个其他项目都会有引用 common,这些项目都是放在自己的 git 服务器上( gitea 搭建的)。go.mod 里面说是可以定义 replace 包名,但是感觉一头雾水,请高人指教一下,如何做才能最高效的切换到 go mod ?


更多关于Golang Go语言中关于 go mod 引用本地其他项目的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

我的做法是在项目的 go.mod 中 replace 本地目录,然后 import 就可以了
<br>module <a target="_blank" href="http://github.com/me/xxxxx" rel="nofollow noopener">github.com/me/xxxxx</a><br><br>go 1.13<br><br>replace <a target="_blank" href="http://github.com/me/xxxxx" rel="nofollow noopener">github.com/me/xxxxx</a> =&gt; ./<br><br>require (<br> <a target="_blank" href="http://github.com/dgrijalva/jwt-go" rel="nofollow noopener">github.com/dgrijalva/jwt-go</a> v3.2.0+incompatible<br>)<br>

不过看你的描述好像 common 与其他项目并不共享一个 go.mod 文件

更多关于Golang Go语言中关于 go mod 引用本地其他项目的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


为啥评论不能使用 markdown 了

是的,common 是一个单独的项目。A,B,C 项目都会引用 common 的代码。
如果改成 go mod 方式,所有涉及的项目都需要按照你的方式去处理么?

如果将它们并为一个项目,最外面放 go.mod ,写上这样一条 replace 就可以了,其他直接 import github.com/me/proj/common

缺点是构建子项目的时候会拉取全部子项目的依赖

A 项目
<br>module interface-account<br><br>go 1.13<br><br>require (<br> account-srv v0.0.0<br> <a target="_blank" href="http://github.com/fsnotify/fsnotify" rel="nofollow noopener">github.com/fsnotify/fsnotify</a> v1.4.7<br> <a target="_blank" href="http://github.com/gin-gonic/gin" rel="nofollow noopener">github.com/gin-gonic/gin</a> v1.5.0<br> <a target="_blank" href="http://github.com/spf13/viper" rel="nofollow noopener">github.com/spf13/viper</a> v1.6.1<br><br> library v0.0.0<br>)<br><br>replace (<br> account-srv v0.0.0 =&gt; ../../../service/account<br> library v0.0.0 =&gt; ../../../../library<br>)<br>

libraryshi 公共项目 C,account-srv 是本地其他项目 B,觉得应该不是这样的。

求大佬指点

包的名字要用完整的路径,即包含你的 repo 地址

例如:gitta.local/library, gitta.local/account-srv



如果项目没有托管地址,只是在本地,其他项目就不能直接引用了么?
那么所有项目的代码都得存在托管地址,也就是 import 要求的带"."

在Go语言中,使用go mod管理依赖时,引用本地其他项目是一个常见的需求。Go的模块系统(go mod)提供了灵活的方式来处理这种情况,主要通过replace指令来实现。

假设你有两个项目,项目A和项目B,且项目A需要引用项目B。你可以按照以下步骤操作:

  1. 确保项目B有模块文件:在项目B的根目录下,初始化一个Go模块(如果还没有的话),通过运行go mod init <module-name>。这里的<module-name>应该是项目B的唯一标识符,通常遵循github.com/<username>/<repo>的格式,即使它是本地的。

  2. 在项目A中引用项目B:在项目A的代码中,你可以像引用远程模块一样引用项目B,比如通过import "github.com/<username>/projectB/pkg"

  3. 使用replace指令:在项目A的go.mod文件中,添加一个replace指令来告诉Go工具链使用本地的项目B路径而不是远程路径。例如:

    replace github.com/<username>/projectB => ../path/to/local/projectB
    

    这里的../path/to/local/projectB是项目B相对于项目A的路径。

完成这些步骤后,你就可以在项目A中正常使用项目B的代码了,同时Go工具链会正确地解析和构建依赖。这种方法允许你在开发过程中轻松地在本地项目中引用和测试其他本地项目。

回到顶部