如何避免导入周期围棋有什么好建议吗?(Any good advice about how to av

2019-08-31 22:13发布

我工作的一个项目去了一个月。 好事是围棋真的很高效。 但一个月的发展后,我已经得到的代码和成千上万行packages 。 为了避免导入周期是一个主要的问题对我来说,任何时候我得到了一个导入周期的错误,我不知道哪里出了问题可能会在第一次。

转到编译器也只有很简单的通知,总是不够好,快速定位问题,如: main.go:7:3: import cycle not allowed 。 它只会帮助你知道哪些文件可能会更深入地引起问题,但没有。 由于import的关系只是变得越来越复杂,而代码的增长,我很想知道如何更有效地避免导入周期中去。 任何帮助深表感谢。

Answer 1:

go list -f '{{join .Deps "\n"}}' <import-path>

将显示包进口的依赖<import-path> -或在当前目录下,如果<import-path>为空。 另外

go list -f '{{join .DepsErrors "\n"}}' <import-path>

希望显示在你的情况下,一些有用的信息。 又见输出

go help list

有关围棋列表工具的其他信息。



Answer 2:

以补充jnml的回答(这有助于“调试”循环引用的问题),你可以使用依赖倒置打破这些周期,加上依赖注入。 对于应用程序,我总是试图遵循的准则清洁建筑 -看到这里特定的Go-例子-我发现的接口Go的“非陈述性实现”(也就是你没有明确地说, type MyStruct struct implements IfceSomething )使这很简单。

所以,如果你有包A -> B -> C -> A ,为您创造InterfaceA (一些相关的名字,显然,以上行为相关的包装相关的:)在分组C,并使其依赖这个接口上,而不是在包A,你要确保包A“实现”了这个接口。

然后,你就必须提供在某一时刻的具体实现,以C(许多可能性在这里,我通常是在知道所有依赖性的主要包这种“胶水”代码)。



Answer 3:

由于进口的关系只是变得越来越复杂,而代码的增长,我很想知道如何更有效地避免导入周期中去。

另一种选择是可视化的依赖关系在您的项目。 这可以用命令行工具来完成godepgraph 。 你可以安装它:

go get -u github.com/kisielk/godepgraph

然后用它在你的应用程序与其他CLI工具的帮助下找到进口周期graphvis 。 有了这个工具,你可以可视化软件包的依赖:

godepgraph -s path/to/my/package | dot -Tpng -o godepgraph.png
open ./godepgraph.png

找到我的代码循环:



文章来源: Any good advice about how to avoid import cycle in Go?