【问题标题】:How do I import generated SDKs in golang?如何在 golang 中导入生成的 SDK?
【发布时间】:2021-07-07 16:43:18
【问题描述】:

我用openapi-generator分别生成多个SDK,放在同一个父目录下:

sdks
--- bar-api
------ go.mod
--- foo-api
------ go.mod

我希望能够在我的客户端代码中导入bar-api。最初有 bar-api 的go.mod 生成为:

module github.com/coolrepo/bar-api
go 1.13

但我无法修复客户端代码中的导入:

bar "github.com/cool-repo/bar-api"

所以我做的是:

sdks
--- bar-api
------ go.mod
---go.mod

即创建sdks/go.mod:

module github.com/coolrepo

go 1.13

并手动将 bar-api 的 go.mod 编辑为:

module github.com/coolrepo/bar-api

require (
    ...
)

replace github.com/coolrepo => ./..

go 1.15

有没有更好的方法来解决它?这个似乎工作,但这个替换看起来有点hacky。

【问题讨论】:

  • 这些真的需要单独的模块吗?关于您的用例的信息不多,但是当人们真正需要的是同一模块中的一个包时,创建子模块似乎很常见。
  • 好吧,这个 openapi-generator 接受 API 的 yaml 并输出一个模块(带有生成的go.mod),如果有意义的话,我真的不想将所有 API 的 yaml 合并成一个组合的 yaml。

标签: go openapi-generator goimports


【解决方案1】:

“修复它的更好方法”是将所有生成的 Go 包放在一个模块中,而不是将 repo 拆分为多个模块。

  1. rm bar-api/go.mod
  2. go mod tidy

如果您需要能够独立于同一 repo 中的另一组软件包标记一组软件包的发布,您只需要将 repo 拆分为单独的模块。对于生成的服务 API,这可能不值得为多个模块兼顾版本的开发开销。

【讨论】:

  • hm 因为这个 openapi-generator 需要 API 的 yaml 并输出一个模块,如果这有意义的话,我真的不想将所有 API 的 yaml 合并成一个组合的 yaml,你会建议运行rm {api}/go.mod as一个单独的黑客/行动?但这看起来与我在评论部分收到的建议相似,我不确定我是否愿意这样做。
  • 来自github.com/OpenAPITools/openapi-generator/issues/4773,您似乎可以使用.openapi-generator-ignore 文件来请求它跳过这些文件。
  • 有趣,这听起来像是一个计划,我如何才能通过客户端代码分别导入这些包?
  • 一个模块可能包含多个包,所以你的客户端代码require github.com/coolrepo vX.Y.Z在他们的go.mod文件中,然后他们可以import github.com/coolrepo/bar-api在他们的.go源文件中加载在该模块中找到的包。
  • 有趣,所以基本上你是说我应该删除所有coolrepo/{api}/go.mod 文件,并且只有go.mod 作为repo 根级别(coolrepo/go.mod),然后我将能够使用例如 imoport api import github.com/coolrepo/bar-api。这个coolrepo/go.mod 应该是什么样子的?
猜你喜欢
  • 2019-02-05
  • 2017-05-01
  • 1970-01-01
  • 2021-01-06
  • 2020-03-31
  • 2020-09-12
  • 2022-01-08
  • 2022-02-16
  • 1970-01-01
相关资源
最近更新 更多