我工作的一个项目去了一个月。 好事是围棋真的很高效。 但一个月的发展后,我已经得到的代码和成千上万行packages
。 为了避免导入周期是一个主要的问题对我来说,任何时候我得到了一个导入周期的错误,我不知道哪里出了问题可能会在第一次。
转到编译器也只有很简单的通知,总是不够好,快速定位问题,如: main.go:7:3: import cycle not allowed
。 它只会帮助你知道哪些文件可能会更深入地引起问题,但没有。 由于import
的关系只是变得越来越复杂,而代码的增长,我很想知道如何更有效地避免导入周期中去。 任何帮助深表感谢。
go list -f '{{join .Deps "\n"}}' <import-path>
将显示包进口的依赖<import-path>
-或在当前目录下,如果<import-path>
为空。 另外
go list -f '{{join .DepsErrors "\n"}}' <import-path>
希望显示在你的情况下,一些有用的信息。 又见输出
go help list
有关围棋列表工具的其他信息。
以补充jnml的回答(这有助于“调试”循环引用的问题),你可以使用依赖倒置打破这些周期,加上依赖注入。 对于应用程序,我总是试图遵循的准则清洁建筑 -看到这里特定的Go-例子-我发现的接口Go的“非陈述性实现”(也就是你没有明确地说, type MyStruct struct implements IfceSomething
)使这很简单。
所以,如果你有包A -> B -> C -> A
,为您创造InterfaceA
(一些相关的名字,显然,以上行为相关的包装相关的:)在分组C,并使其依赖这个接口上,而不是在包A,你要确保包A“实现”了这个接口。
然后,你就必须提供在某一时刻的具体实现,以C(许多可能性在这里,我通常是在知道所有依赖性的主要包这种“胶水”代码)。
由于进口的关系只是变得越来越复杂,而代码的增长,我很想知道如何更有效地避免导入周期中去。
另一种选择是可视化的依赖关系在您的项目。 这可以用命令行工具来完成godepgraph 。 你可以安装它:
go get -u github.com/kisielk/godepgraph
然后用它在你的应用程序与其他CLI工具的帮助下找到进口周期graphvis 。 有了这个工具,你可以可视化软件包的依赖:
godepgraph -s path/to/my/package | dot -Tpng -o godepgraph.png
open ./godepgraph.png
找到我的代码循环: