依赖三角
Dependency triangle
依赖关系是 Go 的一个问题,但这是一个新问题:
- 应用
A
直接依赖库B
和C
- 库
B
直接依赖库C
如果我们在应用程序代码中有这样的东西A
:
funcyInstance := &C.FuncyObject{}
B.CleverFunction(funcyInstance)
在库中时 B
:
func CleverFunction(arg *C.FuncyObject) {}
它引发错误:
cannot use funcyInstance (type "*A/vendor/github.com/C".FuncyObject) as type "*B/vendor/github.com/C".FuncyObject in argument to B.CleverFunction
我正在使用 Glide 作为依赖管理器。
我知道这种依赖配置导致存在多种类型而不是单一类型(对于所有库),并且可能它只是 Go 的反模式。不管怎样...如何解决这个问题?
我会删除 B
下的 vendor
文件夹,并将 C
放在根 vendor
文件夹中(对于应用程序 A
如果我让你的结构正确)。
这样一来,您最终只能为每种类型分配一个位置。
不确定为什么 B
首先会有一个 vendor
文件夹,因为 Glide 的建议对此很明确:
http://glide.readthedocs.io/en/latest/vendor/
Libraries (codebases without a main package) should not store outside packages in a vendor/ folder
和
In applications (codebases with a main package) there should only be one vendor/ directory at the top level
依赖关系是 Go 的一个问题,但这是一个新问题:
- 应用
A
直接依赖库B
和C
- 库
B
直接依赖库C
如果我们在应用程序代码中有这样的东西A
:
funcyInstance := &C.FuncyObject{}
B.CleverFunction(funcyInstance)
在库中时 B
:
func CleverFunction(arg *C.FuncyObject) {}
它引发错误:
cannot use funcyInstance (type "*A/vendor/github.com/C".FuncyObject) as type "*B/vendor/github.com/C".FuncyObject in argument to B.CleverFunction
我正在使用 Glide 作为依赖管理器。
我知道这种依赖配置导致存在多种类型而不是单一类型(对于所有库),并且可能它只是 Go 的反模式。不管怎样...如何解决这个问题?
我会删除 B
下的 vendor
文件夹,并将 C
放在根 vendor
文件夹中(对于应用程序 A
如果我让你的结构正确)。
这样一来,您最终只能为每种类型分配一个位置。
不确定为什么 B
首先会有一个 vendor
文件夹,因为 Glide 的建议对此很明确:
http://glide.readthedocs.io/en/latest/vendor/
Libraries (codebases without a main package) should not store outside packages in a vendor/ folder
和
In applications (codebases with a main package) there should only be one vendor/ directory at the top level