依赖三角

Dependency triangle

依赖关系是 Go 的一个问题,但这是一个新问题:

如果我们在应用程序代码中有这样的东西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