Je suis nouveau pour aller travailler sur un exemple de code que je veux localiser.
Dans la main.go
déclaration d'importation d' origine , c'était:
import (
"log"
"net/http"
"github.com/foo/bar/myapp/common"
"github.com/foo/bar/myapp/routers"
)
Maintenant, j'ai common
et routers
emballé/home/me/go/src/myapp
J'ai donc converti l'instruction d'importation en:
import (
"log"
"net/http"
"./common"
"./routers"
)
Mais quand je cours, go install myapp
j'obtiens 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 l'instruction d'importation, j'obtiens:
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?
Réponses:
Eh bien, j'ai compris le problème. En gros, le chemin de départ pour l'importation est
$HOME/go/src
Il me fallait donc juste ajouter
myapp
devant les noms de paquet, c'est-à-dire que l'importation devrait être:import ( "log" "net/http" "myapp/common" "myapp/routers" )
la source
myapp
est une mauvaise idée, par exemple si vous modifiez le nom du projet, toute l'importation échouerago mod init <module_name>
et puis justeimport "<module_name>/<pkg_name>"
.Si vous utilisez Go 1.5 ci-dessus, vous pouvez essayer d'utiliser la fonction de vente . Il vous permet de placer votre package local dans le dossier du fournisseur et de l'importer avec un chemin plus court. Dans votre cas, vous pouvez placer votre dossier commun et vos routeurs dans le dossier du fournisseur afin que ce soit comme
myapp/ --vendor/ ----common/ ----routers/ ------middleware/ --main.go
et importez-le comme ça
import ( "common" "routers" "routers/middleware" )
Cela fonctionnera car Go essaiera de rechercher votre package en commençant par le répertoire du fournisseur de votre projet (s'il a au moins un fichier .go) au lieu de $ GOPATH / src.
FYI: Vous pouvez faire plus avec le fournisseur, car cette fonctionnalité vous permet de mettre "tout le code de vos dépendances" pour un package dans le répertoire de votre propre projet afin qu'il puisse toujours obtenir les mêmes versions de dépendances 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 le rendre facile, essayez de chercher govendor par Daniel Theophanes
Pour en savoir plus sur cette fonctionnalité, essayez de chercher ici
Comprendre et utiliser le dossier du fournisseur par Daniel Theophanes
Comprendre la gestion des dépendances Go par Lucas Fernandes da Costa
J'espère que vous ou quelqu'un d'autre le trouverez utile
la source
Les chemins d'importation sont relatifs à vos variables d'environnement
$GOPATH
et$GOROOT
. Par exemple, avec ce qui suit$GOPATH
:GOPATH=/home/me/go
Les packages situés dans
/home/me/go/src/lib/common
et/home/me/go/src/lib/routers
sont importés respectivement comme:import ( "lib/common" "lib/routers" )
la source
go install
packages qui utilisent des importations relatives.$GOPATH/src
.Le paquet local est un problème ennuyeux en cours de route.
Pour certains projets de notre entreprise, nous décidons de ne pas utiliser du tout de sous-packages.
$ glide install
$ go get
$ go install
Tout le travail.
Pour certains projets, nous utilisons des sous-packages et importons des packages locaux avec le chemin complet:
import "xxxx.gitlab.xx/xxgroup/xxproject/xxsubpackage
Mais si nous forkons ce projet, les sous-packages font toujours référence à l'original.
la source