インポートサイクルは許可されていません


135

に問題があります

インポートサイクルは許可されていません

コントローラをテストしようとすると表示されます。私が持っている出力として

can't load package: import cycle not allowed
package project/controllers/account
    imports project/controllers/base
    imports project/components/mux
    imports project/controllers/account
import cycle not allowed
package project/controllers/account
    imports project/controllers/base
    imports project/components/mux
    imports project/controllers/account
import cycle not allowed
package project/controllers/account
    imports project/controllers/base
    imports project/components/mux
    imports project/controllers/routes
    imports project/controllers/base

誰かがこのエラーを読んだり理解したりする方法を教えてもらえますか?依存関係はどこで間違っていますか?


13
accountパッケージのインポートbaseインポートパッケージ、muxインポートしたパッケージ、accountパッケージを。これは、インポートの依存関係の循環的なセットであり、許可されていません。baseインポートmux、インポートroutes、インポートの別のサイクルもあるようですbase
Amit Kumar Gupta

回答:


169

これが最初のインポートサイクルの問題の図です。

                  project/controllers/account
                     ^                    \    
                    /                      \
                   /                        \ 
                  /                         \/
         project/components/mux <--- project/controllers/base

あなたは私の悪いASCIIチャートで見ることができるようにするときに、インポートサイクルを作成しているということであるproject/components/mux輸入project/controllers/account。Goは循環依存関係をサポートしていないため、import cycle not allowedコンパイル時にエラーが発生します。


9
ひどいことに、これはコンパイル時にのみ現れます。私がやったことをすることが許可されていないことを確認するためだけに私の穴プロジェクトを再構築するために多くの時間を無駄にしました... dafug ...
C4d

35
これが囲碁が嫌いな理由の一つです。そして、それはダース理由の1つにすぎません。
tom10271 2018年

13
循環depを許可すると、depのサークル全体が変更されるたびにdepのサークル全体を再コンパイルする必要があるため、コンパイル時間が大幅に増加します。循環depを使用すると、プログラムについて推論することが難しくなり、複雑になる傾向があるため、認知負荷も高くなります。
jmaloney 2018年

これリンターあなたは、私が対コード上の任意のリンティングを参照してくださいいけない使用している
Gopherine

アプリを実行しているときにこのエラーが表示されるwatcher
R Sun

98

私はこれに遭遇しました。パッケージ名自体を使用して、同じパッケージ内からメソッド/タイプにアクセスしている可能性があります。

ここに私が何を意味するかを説明する例があります:

foo.go:

// foo.go
package foo

func Foo() {...}

foo_test.go:

// foo_test.go
package foo

// try to access Foo()
foo.Foo() // WRONG <== This was the issue. You are already in package foo, there is no need to use foo.Foo() to access Foo()
Foo() // CORRECT

6
私の意見では、これがより良い答えです。受け入れられた回答も同様に有効ですが、そのような失敗の理論以外は何も説明していません。ただし、@ Jonathan Linの回答は、この不可解なエラーメッセージとその対処方法を完全に説明しています。
ファンタシトカルビースト

3

インポートした可能性があります

project/controllers/base

内部

project/controllers/routes

以前にインポートしました。それはサポートされていません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.