J'essaie de comprendre comment organiser le code en utilisant des packages "internes". Permettez-moi de montrer quelle est ma structure:
project/
internal/
foo/
foo.go # package foo
bar/
bar.go # package bar
main.go
# here is the code from main.go
package main
import (
"project/internal/foo"
"project/internal/bar"
)
project/
est en dehors de l'arborescence GOPATH. Quel que soit le chemin que j'essaie d'importer depuis main.go
, rien ne fonctionne, le seul cas qui fonctionne correctement est import "./internal/foo|bar"
. Je pense que je fais quelque chose de mal ou que je me trompe en général avec une idée de paquet "interne". Quelqu'un pourrait-il clarifier les choses, s'il vous plaît?
METTRE À JOUR
L'exemple ci-dessus est correct, le seul dont j'avais besoin était de placer le dossier project/
sous $GOPATH/src
. Le chemin d'importation, comme le project/internal/foo|bar
, est réalisable si nous l'importons uniquement à partir d'un sous-arbre project/
et non de l'extérieur.
Les packages doivent être situés dans votre $GOPATH
pour pouvoir être importés. L'exemple que vous avez donné avec import "./internal/foo|bar"
fonctionne car il effectue une importation locale. internal
permet uniquement au code qui ne partage pas un répertoire racine commun avec votre répertoire internal
de importer les packages dans internal
.
Si vous mettez tout cela dans votre gopath, alors vous essayez d'importer depuis un emplacement différent tel que OuterFolder/project2/main.go
où OuterFolder
contient à la fois project
et project2
, puis import "../../project/internal/foo"
échouera. Il échouerait également en tant que import "foo"
ou de toute autre manière que vous avez essayée pour ne pas satisfaire à cette condition;
Une importation d'un chemin contenant l'élément “internal” est interdite si le code d'importation est en dehors de l'arborescence enracinée au niveau du parent du fichier Répertoire «interne».
Maintenant, si vous aviez le chemin $GOPATH/src/project
, alors vous pourriez faire import "foo"
et import "bar"
à partir de $GOPATH/src/project/main.go
et l'importation réussirait. Les éléments qui ne figurent pas sous project
ne pourront toutefois pas importer foo
ou bar
.
ci-dessous est plus évolutif, surtout si vous envisagez de créer plusieurs fichiers binaires
github.com/servi-io/api
├── cmd/
│ ├── servi/
│ │ ├── cmdupdate/
│ │ ├── cmdquery/
│ │ └── main.go
│ └── servid/
│ ├── routes/
│ │ └── handlers/
│ ├── tests/
│ └── main.go
├── internal/
│ ├── attachments/
│ ├── locations/
│ ├── orders/
│ │ ├── customers/
│ │ ├── items/
│ │ ├── tags/
│ │ └── orders.go
│ ├── registrations/
│ └── platform/
│ ├── crypto/
│ ├── mongo/
│ └── json/
Les dossiers à l'intérieur de cmd/
représentent le nombre de fichiers binaires que vous souhaitez créer.
Lorsque vous créez un projet root, il est toujours préférable de suivre le format $GOPATH/src/repo_url/username/project
ex: $GOPATH/src/github.com/Apache/thrift
.
internal
packageinternal
packageinternal
internal
ne peuvent pas être importés à partir de packages racine de projet autres que dans le package internal
, cmd
ou le fichier main.go de la racine du projet, qui inclut le main func.Projets qui suivent la structure du package internal
Remarque: la plupart des bibliothèques go ont utilisé ce package internal
.
Plus: Exemples