12
votes

Google Go appengine importations et conflits lors de la servition / des tests


0 commentaires

3 Réponses :


24
votes

Appengine "Conflit avec le même fichier importé de GOPATH" problème:

appengine importe des choses sous le répertoire racine (c'est-à-dire où l'app.yaml est). Cela entraînera deux importations, une par appengine lorsqu'elle scanne les répertoires et une seconde par votre source lorsqu'elle est explicitement importée.

Vous avez deux choix:

N'utilisez pas le chemin d'importation complet (pour les packages de sous-dossiers) avec Appengine.

  • Supprimez la partie de référentiel source de l'importation. Donc au lieu de "github.com/blah/blah" ce serait "bla / bla".

    Remarque: Ce genre est craint, car il offre votre apport de construction et de votre logiciel spécifique. Vous pouvez faire cela un peu mieux -Maybe-en utilisant Construire des contraintes . par exemple. + Construire! Appengine ou + Build! Appengine Pour inclure / Supprimer certains fichiers de la version en fonction de si vous ciblez appengine.

    Déplacez vos modules / dépendances (sous-dossiers) à un projet distinct et indépendant pour le faire fonctionner avec la convention d'importation de chemin complète:

    1. Débarrassez-vous de tous les répertoires / dépendances dans le projet principal (où Votre app.yaml est), afin que appengine ne puisse pas les numériser et les trouver.
    2. déplacez-les vers un autre projet indépendant (je l'ai réussi) sans app.yaml qui est pas un sous-répertoire (par exemple / Markhayden / SampleSudeps).
    3. puis tirez ces dépendances via Importation complète du chemin. par exemple. github.com/markhayden/sampleSudeps/lib1.

      Résumé: pour les packages de sous-dossiers dans un projet Appengine n'inclut pas la partie "Source Repository" du chemin d'importation ou utilisez uniquement appengine à init () et déplacez tout votre autre code séparer les projets et utiliser des dépendances externes.


11 commentaires

Tout d'abord, merci beaucoup d'avoir pris le temps de regarder les choses. Deuxièmement, j'ai lu «Comment écrire un code Go» à quelques reprises et organisé plusieurs projets en dehors de Appengine sans problème. Celui-ci est organisé un peu Wonky parce que j'ai essayé de résoudre le problème et de déplacer des choses autour. Quoi qu'il en soit, j'ai commencé à essayer votre méthode ci-dessus et d'avoir des problèmes. Ajouté ce que je vois à la post d'origine en raison de la longueur.


Pour que cela fonctionne avec votre structure de répertoire (ce que j'avais toujours corrigé pour être plus conventionnel), vous pouvez rendre votre correspondance à l'importation tout ce qui est après votre GoPath. par exemple. Importer "Échantilleux / app / src / lib1". Si je tire votre application localement en $ gopath / github.com / markhayden / et corrige vos déclarations d'importation pour être tout après mon GOPATH E.G. "github.com/markhayden/sampleSue/app/src/lib1" Alors tout fonctionne. Remarquez comment je devais inclure les annuaires / app / src / src. Cela dit, je tuerais les annuaires de l'application et de la SRC et de tout déplacer en SRC dans un dossier Échantilleux, alors votre importation sera beaucoup plus simple.


Yah j'ai changé la structure selon vos recommandations (ajouté une mise à jour ci-dessus). Alors maintenant, mon gopath est / users / markhayden / projects / go et ma structure de répertoire est affichée ici: f.cl.ly/items/1r2n46432k1z0j0w0t0n/dirtruct.jpg


Également mis à jour le repo GitHub avec les fichiers actuels pour "exemplesProject"


C'est essentiellement comme si j'utilise des chemins par rapport à mon gopathe $, les tests vont bien. Mais lorsque je sert à deux fois de charger deux fois, la thèse générant l'erreur. Sur le flipside, si j'utilise des chemins relatifs à mon application, il sert d'amende car les importations ne sont que chargées une fois que les tests échouent, car il ne peut pas trouver les dépendances nécessaires. Un peu envie d'un bug de test appengine? Mais vous dites que vous pouvez exécuter goapp servir à partir de l'application principale ainsi que goapp test -v de Dire le répertoire lib1?


Fwiw. Il suffit de tester sur une machine Linux que je suis positif est configuré par standards de Googles (identiques à votre Reco Matt) et il a le même problème exact.


OK, avec votre nouvelle organisation, j'ai reproduit les "conflits avec le même fichier importé de la question de GOPATH". Il semble que Appengine analyse les importations manuellement sous la racine (où le fichier App.YAML est) et ceux-ci sont conflictuels avec vos chemins explicitement importés. Ajout à la réponse ci-dessus ...


BTW - Je changerais votre titre de question sur "Google Golang appengine importations et conflits" ou quelque chose. Pour réfléchir plus précisément où cela est allé ... :)


Bon appel, aussi qui semble avoir travaillé dans l'exemple de l'application. Va déplacer mon projet principal vers la même configuration et voir si tout est bon (les doigts croisés). Merci donc tellement tellement de prendre le temps à ce sujet. Va certainement vous donner un crédit une fois que l'application principale est en cours d'exécution. Etre prêt!


Demandez-le maintenant. A fini par mettre tout dans un dossier maître, la structure recommandée peut donc tous vivre dans un seul repo, mais tout semble fonctionner. Devra retravailler quelques choses mais ne peut sérieusement pas assez merci.


J'essaie cette solution mais je ne peux pas le faire travailler .. Je me souviens que ceci est un problème pour la dernière fois, j'ai lancé un projet de moteurs Google App. Si quelqu'un a le temps de regarder mon problème, pouvez-vous voir mon message à ce sujet. Merci! Stackoverflow.com/Questtions/41677358/...



17
votes

J'ai proposé une autre option qui n'est pas discutée ici et à mon avis est beaucoup plus facile à traiter (et à garder votre application moins appengine spécifique). Disons que vous avez le repo à github.com/blah/blah et maintenant, le dossier racine du repo définit votre serveur de moteur d'application.

Premièrement, déplacez le app.yaml et d'autres fichiers spécifiques du moteur d'application (pas .go fichiers) dans github.com/blah/appengine/ app.yaml .

Suivant, où que vous exécutez votre fonction init pour l'App moteur, renommez-le à quelque chose comme Func Run () {...} , puis dans github.com /Blah/blah/whatever.go Écrivez quelque chose comme ceci: xxx

de mon expérience, cela a résolu le problème et a rendu les choses beaucoup plus faciles. Je mettrai à jour cela si je rencontre des problèmes majeurs qui en font une mauvaise solution.


4 commentaires

Merci pour votre réponse. Certainement une solution beaucoup plus propre (et évite l'incompatibilité des espaces de noms).


Fonctionne parfaitement. J'ai essayé la réponse acceptée, mais je n'ai pas pu obtenir Atom d'accord avec la solution même si elle compilait. Cette solution compile toutefois et convient avec Atom (GO-Plus).


Je trouve une solution documentée ici plutôt plus approprié pour telle cas. Portez une attention particulière à Nobuild_files: ... App.YAML Configuration.


@iswak dans ma défense Le fil que vous connaissez a été créé 10 mois après ma réponse, un peu comme ce commentaire est super différé;)



4
votes

J'ai eu beaucoup de difficulté à suivre diverses réponses et à comprendre comment résoudre le problème.

Mais après beaucoup de recherches, je crois comprendre à la fois cause et solution:

L'outillage Google App-Builder fait du chemin-mugissement et la cause cela. Ils sont conscients de l'insecte mais pas d'ETA pour le réparer.

Résumé du problème: Tous les fichiers .go à l'intérieur ou au-dessous de le répertoire tenant main.go / app.yaml sera double importé ...

En résumé, assurez-vous simplement que tous nos fichiers / packages sont frères et sœurs et non décédents du répertoire contenant ces deux fichiers ...


1 commentaires

Je fais des services dans le même code Repo et je n'ai pas remarqué la légère différence de structure entre mes dossiers - c'était en effet mon problème. Merci Dewey. À titre de note latérale - cela ne semble que si le projet est auto-référençant, c'est-à-dire que vous liez les packages dans le même projet.