如何查明“不允许导入周期”的问题?
如何分析哪个源文件导致“不允许导入循环”问题?错误消息不够清楚,无法让我解决问题:
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。
一旦确定要消除哪两条边,只需确定导入包的哪些源文件包含有问题的导入声明,并找到重构代码以删除它们的方法。