Organisation d'un projet de Go à plusieurs fichiers

Note: cette question est liée à celle-ci , mais deux ans est une très longue période dans L'histoire de Go.

Quelle est la méthode standard pour organiser un projet Go pendant le développement ?

mon projet est un paquet unique mypack , donc je suppose que j'ai mis tous les .allez les fichiers dans un répertoire mypack .

mais alors, je voudrais le tester pendant le développement Donc j'ai besoin au moins d'un fichier déclarant le main paquet, de sorte que je peux le faire go run trypack.go

comment organiser cela ? Dois-je faire go install mypack chaque fois que je veux l'essayer ?

212
go
demandé sur Gauranga 2012-04-03 04:20:13

7 réponses

je recommande de revoir cette page sur Comment écrire Go Code

il documente à la fois comment structurer votre projet d'une manière conviviale go build , et aussi comment écrire des tests. Il n'est pas nécessaire que les épreuves soient une cmd utilisant le colis main . Ils peuvent simplement être des fonctions TestX nommées dans chaque paquet, et ensuite go test les découvrira.

la structure suggérée dans ce lien dans votre question est un peu dépassé, maintenant avec la sortie de Go 1. Vous n'aurez plus besoin de placer un répertoire pkg sous src . Les seuls 3 répertoires liés à spec sont les 3 répertoires de la racine de votre GOPATH: bin, pkg, src . Src en dessous, vous pouvez simplement placer votre projet mypack , et en dessous qui est tout de votre .allez les fichiers y compris le mypack_test.go

go build s'intégrera alors au niveau de la racine pkg et bin.

donc votre GOPATH pourrait ressembler à ceci:

~/projects/
    bin/
    pkg/
    src/
      mypack/
        foo.go
        bar.go
        mypack_test.go

export GOPATH=$HOME/projects

$ go build mypack
$ go test mypack
157
répondu jdi 2014-02-02 20:07:13

jdi a le droit de l'information concernant l'utilisation de GOPATH . Je voudrais ajouter que si vous avez l'intention d'avoir un binaire ainsi vous pouvez ajouter un niveau supplémentaire pour les répertoires.

~/projects/src/
    myproj/
        mypack/
            lib.go
            lib_test.go
            ...
        myapp/
            main.go

exécuter go build myproj/mypack construira le paquet mypack avec ses dépendances l'exécution de go build myproj/myapp construira le binaire myapp avec ses dépendances qui inclut probablement la bibliothèque mypack .

59
répondu Jeremy Wall 2014-03-24 19:29:27

j'ai étudié un certain nombre de projets Go et il ya un peu de variation. Vous pouvez en quelque sorte dire qui vient de C et qui vient de Java, car le premier dump à peu près tout dans le répertoire racine des projets dans un paquet main , et le second a tendance à tout mettre dans un répertoire src . Ni est optimal. Chacune a des conséquences parce qu'elle affecte les voies d'importation et la façon dont les autres peuvent les réutiliser.

Pour obtenir les meilleurs résultats J'ai élaboré l'approche suivante.

myproj/
  main/
    mypack.go
  mypack.go

mypack.go est package mypack et main/mypack.go est (évidemment) package main .

si vous avez besoin de fichiers de support supplémentaires, vous avez deux choix. Soit vous les gardez tous dans le répertoire racine, soit vous mettez privé fichiers de support dans un sous-répertoire lib . Par exemple:

myproj/
  main/
    mypack.go
  myextras/
    someextra.go
  mypack.go
  mysupport.go

ou

myproj.org/
  lib/
    mysupport.go
    myextras/
      someextra.go
  main/
    mypack.go
  mypage.go

Seulement mis les fichiers dans un lib répertoire s'ils ne sont pas destinés à être importés par un autre projet. En d'autres termes, s'ils sont privé fichiers de soutien. C'est l'idée d'avoir lib --pour séparer les interfaces publiques des 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 utilisez lib alors les fichiers de support internes auront un chemin d'importation qui est myproj.org/lib/mysupport .

pour la construction du projet, utilisez main/mypack , p.ex. go build main/mypack . Si vous avez plus d'un exécutable, Vous pouvez également séparer ceux sous main sans avoir à créer des projets séparés. par exemple main/myfoo/myfoo.go et main/mybar/mybar.go .

47
répondu trans 2016-03-26 11:02:54

je trouve très utile pour comprendre comment organiser le code dans Golang ce chapitre http://www.golang-book.com/11 du livre écrit par Caleb Doxsey

21
répondu edap 2016-08-02 06:42:33

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. jdi réponse est bonne, mais si vous utilisez github ou bitbucket et vous avez d'autres bibliothèques, vous devez créer la structure suivante:

~/projects/
bin/
pkg/
src/
  github.com/
    username/
        mypack/
            foo.go
            bar.go
            mypack_test.go
        mylib/
            utillib.go
            utillib_test.go

En le faisant de cette façon, vous pouvez avoir un référentiel pour mylib qui peut être utilisé pour d'autres projets et peuvent être récupérées par "aller chercher". 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 /

11
répondu alexdotc 2014-11-09 04:33:06

Conserver les fichiers dans le même répertoire et utiliser package main dans tous les fichiers.

myproj/
   your-program/
      main.go
      lib.go

puis exécuter:

~/myproj/your-program$ go build && ./your-program
4
répondu Gustav 2013-10-24 16:13:08

voyons comment la commande go get repository_remote_url gère la structure du projet sous $GOPATH . Si nous faisons un go get github.com/gohugoio/hugo il clonera le dépôt sous

$GOPATH / src/ repository_remote/user_name/project_name


$GOPATH / src/ github.com/gohugoio/hugo

C'est une bonne façon de créer votre chemin initial du projet . Maintenant, nous allons explorer quels sont les types de projet là-bas et comment leurs structures internes sont organisés. Tous les projets de golang dans la communauté peuvent être classés sous

  • Libraries (pas de fichiers binaires exécutables)
  • Single Project (contient seulement 1 exécutable binaire)
  • Tooling Projects (contient plusieurs exécutables binaires))

généralement, les dossiers de projet golang peuvent être empaquetés sous n'importe quels principes de conception tels que DDD , POD

la plupart des projets go disponibles suit ce Package Oriented Design

Package Oriented Design implémentation seulement à l'intérieur de ses propres paquets, à l'exception du paquet /internal . ces paquets ne peuvent pas communiquer entre eux.


bibliothèques

  • les projets tels que les pilotes de base de données , qt peuvent mettre dans cette catégorie.
  • certaines bibliothèques telles que couleur , maintenant suit a structure plate sans autres paquets.
  • la plupart de ces projets de bibliothèque gère un paquet appelé interne .
  • /internal package est utilisé pour maintenir go de fichiers qui utilise d'autres de plusieurs paquets à l'intérieur du projet.
  • N'ont pas de binaires exécutables, donc pas de fichiers qui contiennent le principal func .

 ~/$GOPATH/
    bin/
    pkg/
    src/
      repository_remote/
        user_name/
            project_name/
              internal/
              other_pkg/

Projet Unique

  • projets tels que hugo , etcd a un unique fonction principale dans le niveau de racine et.
  • l'Objectif est de générer un binaire

Outillage Projets

  • projets tels que kubernetes , de l'ethereum a multiple principal func organisé en vertu d'un paquet appelé cmd
  • cmd/ paquet gère le nombre de binaires (outils) que nous voulons construire

 ~/$GOPATH/
    bin/
    pkg/
    src/
      repository_remote/
        user_name/
            project_name/
              cmd/
                binary_one/
                   main.go
                binary_two/
                   main.go
                binary_three/
                   main.go
              other_pkg/
0
répondu noelyahan 2018-08-21 06:54:29