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?
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"
)
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
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"
)
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 install
go 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/xxsubpackage
glide install
go get/install
tout fonctionne . Mais si nous découpons ce projet, les sous-packages font toujours référence à celui d'origine.