web-dev-qa-db-fra.com

Comment importer des paquets locaux au go?

Je suis nouveau pour aller travailler sur un exemple de code que je veux localiser.

Dans la déclaration d'importation main.go d'origine, il était:

 import (
    "log"
    "net/http"
   "github.com/foo/bar/myapp/common"
    "github.com/foo/bar/myapp/routers"
)

Maintenant, j'ai common et routers package dans /home/me/go/src/myapp

J'ai donc converti la déclaration d'importation en:

import (
    "log"
    "net/http"
    "./common"
    "./routers"
)

Mais quand je lance go install myapp je reçois ces erreurs:

can't load package: /home/me/go/src/myapp/main.go:7:3: local import "./common" in non-local package

De plus, lorsque j'utilise common et routers au lieu de ./common et ./routers dans la déclaration d'importation, je reçois

myapp/main.go:7:3: cannot find package "common" in any of:
    /usr/local/go/src/common (from $GOROOT)
    /home/me/go/src/common (from $GOPATH)
myapp/main.go:8:2: cannot find package "routers" in any of:
    /usr/local/go/src/routers (from $GOROOT)
    /home/me/go/src/routers (from $GOPATH)

Comment puis-je réparer cela?

31
Karlom

Eh bien, j'ai compris le problème. En gros, le chemin de départ pour l’importation est $HOME/go/src

Je devais donc simplement ajouter myapp devant les noms de paquet, c'est-à-dire que l'importation devrait être:

import (
    "log"
    "net/http"
    "myapp/common"
    "myapp/routers"
)
26
Karlom

Si vous utilisez Go 1.5 ci-dessus, vous pouvez essayer d'utiliser la fonction vendoring. Il vous permet de placer votre paquet local dans le dossier vendor et de l’importer avec un chemin plus court . Dans votre cas, vous pouvez placer vos dossiers common et routers dans vendor folderso, ce serait comme

myapp/
--vendor/
----common/
----routers/
------middleware/
--main.go

et l'importer comme ça

import (
    "common"
    "routers"
    "routers/middleware"
)

Cela fonctionnera car Go tentera de rechercher votre paquet à partir du répertoire du fournisseur de votre projet (s’il contient au moins un fichier .go) au lieu de $ GOPATH/src.

Pour votre information: vous pouvez en faire plus avec le fournisseur, car cette fonctionnalité vous permet de placer "tout le code de votre dépendance" pour un paquet dans le répertoire de votre propre projet afin qu’il puisse toujours obtenir les mêmes versions de dépendance pour toutes les versions. C'est comme npm ou pip en python, mais vous devez copier manuellement vos dépendances dans votre projet, ou si vous voulez simplifier les choses, essayez de chercher govendor de Daniel Theophanes

Pour en savoir plus sur cette fonctionnalité, essayez de regarder ici

Comprendre et utiliser le dossier du fournisseur de Daniel Theophanes

Comprendre Go Dependency Management par Lucas Fernandes da Costa

J'espère que vous ou quelqu'un d'autre le trouvez utilement

12
Ari Maulana

Les chemins d'importation sont relatifs à vos variables d'environnement $GOPATH et $GOROOT. Par exemple, avec le $GOPATH suivant:

GOPATH=/home/me/go

Les paquets situés dans /home/me/go/src/lib/common et /home/me/go/src/lib/routers sont importés respectivement en tant que:

import (
    "lib/common"
    "lib/routers"
)
8
wlredeye

Le paquet local est un problème ennuyant dans go.

Pour certains projets de notre société, nous décidons de ne pas utiliser de sous-packages. glide installgo get/install tout fonctionne.

Pour certains projets, nous utilisons des sous-packages et importons des packages locaux avec le chemin complet: import "xxxx.gitlab.xx/xxgroup/xxproject/xxsubpackageglide installgo get/install tout fonctionne . Mais si nous découpons ce projet, les sous-packages font toujours référence à celui d'origine.

0
tangxinfa