如何查明 "import cycle not allowed" 问题?

How can I pinpoint an "import cycle not allowed" problem?

如何分析是哪个源文件导致了“不允许导入循环”的问题? 错误信息不够清晰,无法解决问题:

package command-line-arguments
    imports app.exap/i8/internal
    imports app.exap/i8/internal/data/retrieves
    imports app.exap/i8/internal/integration/datastore
    imports app.exap/i8/internal/objects/modules
    imports app.exap/i8/internal/data
    imports app.exap/i8/internal/integration/datastore: import cycle not allowed
package command-line-arguments
    imports app.exap/i8/internal
    imports app.exap/i8/internal/data/retrieves
    imports app.exap/i8/internal/integration/datastore
    imports app.exap/i8/internal/objects/modules
    imports app.exap/i8/internal/data
    imports app.exap/i8/internal/objects/modules: import cycle not allowed

不能将问题归咎于单个源文件,因为导入周期通常涉及来自不同包的多个源文件。

不过,您可以从错误消息中收集有价值的信息:您的项目似乎受到两个不同的导入周期(一个 2 周期和一个 3 周期)的影响,涉及三个包:

要打破这些循环,您首先需要决定应消除循环的哪些边缘。不过,我很难就此给你明确的指导,因为消除的最佳优势在很大程度上取决于你的项目的上下文。

然而,在 Go 中避免导入循环的一个好的经验法则是高级包不应该依赖于低级包。因此,您很可能希望app.exap/i8/internal/data依赖

  • 或者app.exap/i8/internal/integration/datastore
  • app.exap/i8/internal/objects/modules.

一旦您决定要消除哪两条边,只需确定导入包的哪些源文件包含有问题的导入声明,并找到重构代码以删除它们的方法。