web-dev-qa-db-fra.com

Comment utiliser les paquets "internes"?

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.

13

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.goOuterFolder 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.

11
evanmcdonnal

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.

pour plus

6
Edwin Ikechukwu

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 package

  • Si les packages racine de votre projet souhaitent se communiquer, move to internal package
  • Si les packages racine de votre projet n'utilisent/importent que des dépendances standard ou des dépendances fournisseur/tiers, ne déplacez pas vers internal
  • Les éléments contenus dans le package internalne 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

0
noelyahan