我的理解是(a)您正在使用新的 Go 模块系统,并且(b)问题的一部分是当您进行本地开发时,您不希望跨不同的存储库将更改推送到 github 或 gitlab。
换句话说,如果您在本地进行更改,听起来您不想通过 github/gitlab 往返这些更改,以便在您在本地处理的相关存储库中看到这些更改。
最重要的建议
在单个存储库中拥有 > 1 个模块会使您的工作流程变得非常复杂。
如您的示例所示,通常在单个存储库中拥有 > 1 个模块几乎总是需要更多的工作。也很难做到正确。对于大多数人来说,成本几乎总是不值得的。此外,收益通常不是人们所期望的,或者在某些情况下,在 repo 中拥有 > 1 个模块并没有实际的好处。
我肯定会建议您至少现在遵循“1 repo == 1 module”这一普遍遵循的规则。这个答案有更多关于为什么的细节。
使用多个存储库
鉴于您正在使用 Go 模块,一种方法是您可以将replace
指令添加到模块的go.mod
文件中,通知该 Go 模块有关其他 Go 模块在磁盘上的位置。
示例结构
例如,如果您有三个 repos repo1
, repo2
, repo3
,您可以克隆它们,使它们在本地磁盘上彼此相邻:
myproject/
├── repo1
├── repo2
└── repo3
然后,如果repo1
取决于repo2
and repo3
,您可以设置go.mod
文件repo1
以了解其他两个模块的相对磁盘位置:
repo1 go.mod:
replace github.com/me/repo2 => ../repo2
replace github.com/me/repo3 => ../repo3
当您在repo1
目录或其任何子目录中时,go
类似go build
或的命令go test ./....
将使用 和 的磁盘repo2
版本repo3
。
repo2 go.mod:
如果repo2
取决于repo3
,您还可以设置:
replace github.com/me/repo3 => ../repo3
repo3 go.mod:
例如,如果repo3
不依赖于repo1
or中的任何一个repo2
,那么您就不需要将 a 添加replace
到它的go.mod
.
额外细节
模块 wiki 上的替换常见问题解答replace
中更详细地介绍了该指令。
最后,这取决于您的确切用例,但此时的常见解决方案是使用gohack,它可以自动执行其中的一些过程。特别是,它创建了依赖项的可变副本(默认情况下在 中$HOME/gohack
,但位置由$GOHACK
变量控制)。gohack
还将您的当前go.mod
文件设置为具有指向该可变副本的替换指令。