2 回答
TA贡献1895条经验 获得超3个赞
我的理解是(a)您正在使用新的 Go 模块系统,(b)问题的一部分是您在进行本地开发时不希望在不同的存储库中不断将更改推送到 github 或 gitlab。
换句话说,如果您在本地进行了更改,那么听起来您不想通过 github/gitlab 往返这些更改,以便这些更改在您正在本地处理的相关存储库中可见。
最重要的建议
在单个存储库中包含 > 1 个模块会使您的工作流程变得非常复杂。
正如您的示例所示,一般来说,在单个存储库中拥有 > 1 个模块几乎总是需要持续进行更多工作。这也很难做到正确。对于大多数人来说,这种成本几乎总是不值得的。此外,通常带来的好处并不是人们所期望的,或者在某些情况下,在存储库中拥有 > 1 个模块没有实际好处。
我绝对建议您遵循“1 repo == 1 module”这一普遍遵循的规则,至少现在是这样。
使用多个存储库
鉴于您正在使用 Go 模块,一种方法是您可以replace
向模块go.mod
文件添加一条指令,通知该 Go 模块其他 Go 模块在磁盘上的位置。
结构示例
例如,如果您有三个存储库repo1
, repo2
, repo3
,您可以克隆它们,以便它们在本地磁盘上彼此相邻:
myproject/ ├── repo1 ├── repo2 └── repo3
然后,如果repo1
依赖于repo2
和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
,repo2
那么您不需要将 a 添加replace
到其go.mod
。
额外细节
模块 wiki 上的替换常见问题replace
解答中更详细地介绍了该指令。
最后,这取决于您的具体用例,但此时的常见解决方案是使用gohack,它可以自动执行部分过程。特别是,它创建依赖项的可变副本(默认在 中$HOME/gohack
,但位置由$GOHACK
变量控制)。gohack
还设置当前go.mod
文件有一个替换指令来指向该可变副本。
TA贡献1796条经验 获得超7个赞
go get
是可传递的,因此您可以将其添加到构建过程中。典型的 Go 项目构建基本上是:
go get -u ./... && go test ./... && go build ./cmd/myapp
它获取并更新依赖项,运行所有项目测试,然后构建二进制文件。
- 2 回答
- 0 关注
- 114 浏览
添加回答
举报