Remarque: cette question est liée à celle-ci , mais deux ans, c'est très long dans l'histoire de Go.
Quelle est la manière standard d'organiser un projet Go pendant le développement?
Mon projet est un package unique mypack
, donc je suppose que je mets tous les fichiers .go dans un mypack
répertoire.
Mais ensuite, je voudrais le tester pendant le développement donc j'ai besoin d'au moins un fichier déclarant le main
paquet, pour que je puisse fairego run trypack.go
Comment dois-je organiser cela? Dois-je faire go install mypack
chaque fois que je veux l'essayer?
Réponses:
Je recommanderais de revoir cette page sur Comment écrire du code Go
Il explique à la fois comment structurer votre projet de manière
go build
conviviale et comment écrire des tests. Les tests n'ont pas besoin d'être un cmd utilisant lemain
package. Elles peuvent simplement être des fonctions nommées TestX dans le cadre de chaque package, puisgo test
les découvriront.La structure suggérée dans ce lien dans votre question est un peu dépassée, maintenant avec la sortie de Go 1. Vous n'avez plus besoin de placer un
pkg
répertoire soussrc
. Les 3 seuls répertoires liés aux spécifications sont les 3 à la racine de votre GOPATH: bin, pkg, src. Sous src, vous pouvez simplement placer votre projetmypack
, et en dessous se trouvent tous vos fichiers .go, y compris mypack_test.gogo build
sera ensuite intégré au paquet et au niveau racine.Votre GOPATH pourrait donc ressembler à ceci:
export GOPATH=$HOME/projects
Mise à jour: à partir de> = Go 1.11, le système de modules est maintenant une partie standard de l'outillage et le concept GOPATH est sur le point de devenir obsolète.
la source
~
lors de la définition des variables d'environnement , tout comme le shell busybox bourne, par exemple. Essayez-le vous-même:export BOB=~ && env | grep ^BOB
céderaBOB=/your/homedir
$HOME
fonctionne alors dans plus de coques~
, par exemple àfish
jdi a les bonnes informations concernant l'utilisation de
GOPATH
. J'ajouterais que si vous avez l'intention d'avoir également un binaire, vous voudrez peut-être ajouter un niveau supplémentaire aux répertoires.en cours d'exécution
go build myproj/mypack
va construire lemypack
paquet avec ses dépendances en cours d'exécutiongo build myproj/myapp
va construire lemyapp
binaire avec ses dépendances qui incluent probablement lamypack
bibliothèque.la source
J'ai étudié un certain nombre de projets Go et il y a pas mal de variations. Vous pouvez en quelque sorte dire qui vient de C et qui vient de Java, car le premier vidage à peu près tout dans le répertoire racine des projets dans un
main
package, et le dernier a tendance à tout mettre dans unsrc
répertoire. Cependant, aucun n'est optimal. Chacun a des conséquences car il affecte les chemins d'importation et la manière dont les autres peuvent les réutiliser.Pour obtenir les meilleurs résultats, j'ai élaboré l'approche suivante.
Où
mypack.go
estpackage mypack
etmain/mypack.go
est (évidemment)package main
.Si vous avez besoin de fichiers de support supplémentaires, vous avez deux choix. Soit les conserver tous dans le répertoire racine, soit placer les fichiers de support privés dans un
lib
sous - répertoire. Par exempleOu
Ne placez les fichiers dans un
lib
répertoire que s'ils ne sont pas destinés à être importés par un autre projet. En d'autres termes, s'il s'agit de fichiers de support privés . C'est l'idée derrière avoirlib
--pour séparer les interfaces publiques des interfaces privées.Faire les choses de cette façon vous donnera un bon chemin d'importation,
myproj.org/mypack
pour réutiliser le code dans d'autres projets. Si vous utilisezlib
alors les fichiers de support internes auront un chemin d'importation qui indique que,myproj.org/lib/mysupport
.Lors de la construction du projet, utilisez
main/mypack
, par exemplego build main/mypack
. Si vous avez plusieurs exécutables, vous pouvez également séparer ceux qui se trouvent sousmain
sans avoir à créer des projets distincts. par exemplemain/myfoo/myfoo.go
etmain/mybar/mybar.go
.la source
cmd/nameOfMyExecutable
sous-répertoire pour le package principal (uniquement nécessairecmd/…
si vous avez plusieurs commandes; voirgolang.org/x/tools/cmd
; sinon, il est courant de l'échanger et de l'avoirmain.go
au niveau supérieur). La façon dont vous l'avezgo install
créera un exécutable "principal" (ou "main.exe"). De plus, idiomatique consiste à utiliser uninternal
sous-répertoire pour un sous-package interne au package / programme qui n'est pas destiné à être utilisé ailleurs (il est prévu que les futures versions de Go n'imposeront à personne d'importer desinternal
packages de cette manière).Je trouve très utile de comprendre comment organiser le code dans Golang ce chapitre http://www.golang-book.com/11 du livre écrit par Caleb Doxsey
la source
Il ne semble pas y avoir de méthode standard pour organiser les projets Go, mais https://golang.org/doc/code.html spécifie une meilleure pratique pour la plupart des projets. La réponse de jdi est bonne mais si vous utilisez github ou bitbucket et que vous avez également des bibliothèques supplémentaires, vous devez créer la structure suivante:
De cette façon, vous pouvez avoir un référentiel séparé pour mylib qui peut être utilisé pour d'autres projets et peut être récupéré par "go get". Votre projet mypack peut importer votre bibliothèque en utilisant "github.com/username/mylib". Pour plus d'informations:
http://www.alexvictorchan.com/2014/11/06/go-project-structure/
la source
Gardez les fichiers dans le même répertoire et utilisez
package main
dans tous les fichiers.Exécutez ensuite:
la source
Explorons comment la
go get repository_remote_url
commande gère la structure du projet sous$GOPATH
. Si nous faisons un,go get github.com/gohugoio/hugo
il clonera le référentiel sousC'est une bonne façon de créer votre chemin de projet initial . Explorons maintenant quels sont les types de projets et comment leurs structures internes sont organisées. Tous les projets de golang dans la communauté peuvent être classés sous
Libraries
(pas de binaires exécutables)Single Project
(contient seulement 1 binaire exécutable)Tooling Projects
(contient plusieurs binaires exécutables)En règle générale, les fichiers de projet golang peuvent être regroupés sous tous les principes de conception tels que DDD , POD
La plupart des projets go disponibles suivent cette conception orientée package
La conception orientée package encourage le développeur à ne conserver l'implémentation qu'à l'intérieur de ses propres packages, à l'exception du
/internal
package que ces packages ne peuvent pas communiquer entre eux.Bibliothèques
/internal
Le package est principalement utilisé pour masquer l'implémentation des autres projets.Projet unique
Projets d'outillage
cmd/
le package gère le nombre de binaires (outils) que nous voulons construirela source