我的理解是(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取决于repo2and 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不依赖于repo1or中的任何一个repo2,那么您就不需要将 a 添加replace到它的go.mod.
额外细节
模块 wiki 上的替换常见问题解答replace中更详细地介绍了该指令。
最后,这取决于您的确切用例,但此时的常见解决方案是使用gohack,它可以自动执行其中的一些过程。特别是,它创建了依赖项的可变副本(默认情况下在 中$HOME/gohack,但位置由$GOHACK变量控制)。gohack还将您的当前go.mod文件设置为具有指向该可变副本的替换指令。