我正在为多个外部 Go 依赖项制作适配器。一个根包在example.com/api
. 其他子包位于example.com/api/adapters/<adapter-name>
- 每个适配器都具有实现api
包接口的结构,并具有外部库的外部依赖项。
它应该以这种方式使用:某些库(图中的“lib”)导入example.com/api
并仅使用此包中的接口。一些最终应用程序(图中的“app”)使用“lib”包并依赖于example.com/api/adapters/<adapter-name>
.
我负责 API 和适配器包(图中的虚线矩形)。所以我尝试以这种方式构建项目:
.
├── adapters
│ └── adapter1
│ │ └── adapter.go
│ └── adapter2
│ │ └── adapter.go
│ └── adapter3
│ └── adapter.go
├── go.mod
├── go.sum
└── api.go
但这里的问题是,当我尝试制作示例“lib”和“app”模块并在“app”中使用“adapter1”时,该go.sum
文件包含“app”中未使用的“adapter2”和“adapter3”的所有依赖项; 除了“app”定义了不必要的依赖之外,如果“app”想要使用“adapter-1”并使用与adapter-2和adapter-3相同的外部依赖,但版本不同,则可能会出现真正的问题。
我正在考虑将“适配器-{n}”包移动到单独的存储库并拥有包:
example.com/api
example.com/api-adapter-1
example.com/api-adapter-2
example.com/api-adapter-3
但这看起来像是开销,因为一些适配器非常小,可以放在一个文件中。
是否可以排除 go 模块中未使用的传递依赖项并将所有这些包保存在同一个模块/存储库中?