问题描述
假设我有一个 monorepo 并且有几个单独的 golang 服务:
root
└── services
├── svc1
│ ├── go.mod
│ ├── go.sum
│ └── main.go
└── svc2
├── go.mod
├── go.sum
└── main.go
而 svc2 将来将依赖于 svc1。另外要求svc1和svc2可以单独释放。
有没有办法单独发布模块? go mod 文档只假设只有 repo,所以它不提供这种灵活性。
解决方法
它应该可以正常工作。
module path 由存储库根目录(即 VCS 中的根目录)和模块路径组成,如果(引用)“该模块未在存储库的根目录中定义” em>.
因此,使用示例中给出的目录树,您可以添加 svc1 的 go.mod
:
module github.com/root/services/svc1
并在 svc2 的 go.mod
module github.com/root/services/svc2
参考:https://golang.org/ref/mod#vcs-dir
,要标记存储库子目录中模块的发布版本,请将子目录添加为标记的前缀,例如 svc1/v0.1.0
。
每个https://golang.org/ref/mod#vcs-version:
如果在存储库中的子目录中定义了一个模块……,那么每个标签名称必须以模块子目录为前缀,后跟斜杠。例如,模块 golang.org/x/tools/gopls
定义在存储库的 gopls
子目录中,根路径为 golang.org/x/tools
。该模块的版本 v0.4.0
必须在该存储库中具有名为 gopls/v0.4.0
的标记。