依赖三角形

huangapple go评论113阅读模式
英文:

Dependency triangle

问题

依赖关系是Go语言中的一个问题,但这是一种新情况:

  • 应用程序 A 直接依赖于库 BC
  • B 直接依赖于库 C

如果在应用程序 A 的代码中有以下内容:

funcyInstance := &C.FuncyObject{}
B.CleverFunction(funcyInstance)

而在库 B 中有以下内容:

func CleverFunction(arg *C.FuncyObject) {}

就会出现错误:

> 无法将 funcyInstance(类型为 "*A/vendor/github.com/C" 的 FuncyObject)作为参数传递给 B.CleverFunction(类型为 "*B/vendor/github.com/C" 的 FuncyObject)

我正在使用 Glide 作为依赖管理器。

我理解这种依赖关系的配置会导致存在多种类型而不是单一类型(适用于所有库),可能这只是Go语言中的一种反模式。无论如何...如何解决这个问题?

英文:

Dependencies is an issue for Go but this is something new:

  • Application A directly dependent on libraries B and C
  • Library B directly dependent on library C

If we have something like this in code of the application A:

funcyInstance := &C.FuncyObject{}
B.CleverFunction(funcyInstance)

When in lib B:

func CleverFunction(arg *C.FuncyObject) {}

It raises an error:

> cannot use funcyInstance (type "*A/vendor/github.com/C".FuncyObject) as type "*B/vendor/github.com/C".FuncyObject in argument to B.CleverFunction

I'm using Glide as a dependency manager.

I understand that this configuration of dependencies causes existence of several types instead of a single one (for all library) and possibly it is just an anti pattern for Go. Anyway... How to solve the issue?

答案1

得分: 1

我会为你翻译以下内容:

我会删除B下面的vendor文件夹,并将C放在根目录的vendor文件夹中(如果我正确理解你的结构,是为了应用程序A)。

这样,你只需要一个地方存放每种类型的文件。

不确定为什么B一开始会有一个vendor文件夹,因为Glide的建议很明确:

http://glide.readthedocs.io/en/latest/vendor/

> 库(没有主要包的代码库)不应该将外部包存储在vendor/文件夹中

> 在应用程序(有主要包的代码库)中,顶层只应该有一个vendor/目录。

英文:

I'd remove the vendor folder below B, and put C in the root vendor folder (for application A if I am getting your structure correctly).

That way, you only end up with one place for each type.

Not sure why B would have a vendor folder in the first place, since Glide's recommendations are clear on this:

http://glide.readthedocs.io/en/latest/vendor/

> Libraries (codebases without a main package) should not store outside packages in a vendor/ folder

and

> In applications (codebases with a main package) there should only be one vendor/ directory at the top level

huangapple
  • 本文由 发表于 2017年7月29日 03:52:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/45381407.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定