Cycle d'importation non autorisé

135

J'ai un problème avec

cycle d'importation non autorisé

Il apparaît, lorsque j'essaye de tester mon contrôleur. Comme sortie, j'ai

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

Quelqu'un peut-il me dire, comment lire ou comprendre cette erreur? Où est la dépendance?

zero_coding
la source
13
Le accountpackage importe le basepackage, qui importe le muxpackage, qui importe le accountpackage. C'est un ensemble cyclique de dépendances d'importation, ce qui n'est pas autorisé. Il semble que vous ayez également un autre cycle, les baseimportations mux, les importations routes, les importations base.
Amit Kumar Gupta

Réponses:

170

Voici une illustration de votre premier problème de cycle d'importation.

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

Comme vous pouvez le voir avec mon mauvais graphique ASCII, vous créez un cycle d' project/components/muximportation lors des importations project/controllers/account. Étant donné que Go ne prend pas en charge les dépendances circulaires, vous obtenez l' import cycle not allowederreur lors de la compilation.

jmaloney
la source
10
Dommage que cela n'apparaisse que lors de la compilation. J'ai perdu beaucoup de temps à restructurer mon projet de trou juste pour voir que je n'ai pas le droit de faire ce que j'ai fait ... dafug ...
C4d
35
C'est l'une des raisons pour lesquelles je n'aime pas Go. Et ce n'est qu'une des douzaines de raisons.
tom10271
13
Autoriser les déps circulaires augmenterait considérablement les temps de compilation, car tout votre cercle de déps devrait être recompilé à chaque fois que l'un des déps est modifié. Avoir des profondeurs circulaires est également une lourde charge cognitive car il est plus difficile de raisonner sur votre programme et tend vers la complexité.
jmaloney
quel linter utilisez-vous je ne vois pas de peluchage sur vs code
Gopherine
Je peux voir cette erreur lors de l'exécution de l'application viawatcher
R Sun
98

Je viens de rencontrer ça. Vous pouvez accéder à une méthode / un type à partir du même package en utilisant le nom du package lui-même.

Voici un exemple pour illustrer ce que je veux dire:

Dans foo.go:

// foo.go
package foo

func Foo() {...}

Dans 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
Jonathan Lin
la source
6
À mon avis, c'est la meilleure réponse. La réponse acceptée est tout aussi valable, mais n'explique rien d'autre que la théorie d'un tel échec. La réponse de @Jonathan Lin explique cependant parfaitement ce message d'erreur cryptique et comment le combattre.
fantasitcalbeastly
3

Vous avez peut-être importé,

project/controllers/base

à l'intérieur de

project/controllers/routes

Vous avez déjà importé auparavant. Ce n'est pas pris en charge.

Thushara Buddhika
la source