Hinweis: Diese Frage bezieht sich auf diese , aber zwei Jahre sind eine sehr lange Zeit in der Go-Geschichte.
Was ist die Standardmethode, um ein Go-Projekt während der Entwicklung zu organisieren?
Mein Projekt ist ein einzelnes Paket mypack
, also habe ich wohl alle .go-Dateien in einem mypack
Verzeichnis abgelegt .
Aber dann möchte ich es während der Entwicklung testen, damit ich mindestens eine Datei benötige, die das main
Paket deklariert , damit ich es tun kanngo run trypack.go
Wie soll ich das organisieren? Muss ich go install mypack
jedes Mal tun, wenn ich es versuchen möchte?
Antworten:
Ich würde empfehlen, diese Seite unter Schreiben von Go-Code zu lesen
Es dokumentiert sowohl die
go build
freundliche Strukturierung Ihres Projekts als auch das Schreiben von Tests. Tests müssen mit demmain
Paket kein cmd sein . Sie können einfach TestX-benannte Funktionen als Teil jedes Pakets sein undgo test
werden sie dann entdecken.Die in diesem Link in Ihrer Frage vorgeschlagene Struktur ist etwas veraltet, jetzt mit der Veröffentlichung von Go 1. Sie müssten kein
pkg
Verzeichnis mehr unter platzierensrc
. Die einzigen 3 spezifikationsbezogenen Verzeichnisse sind die 3 im Stammverzeichnis Ihres GOPATH: bin, pkg, src. Unter src können Sie einfach Ihr Projekt platzierenmypack
, und darunter befinden sich alle Ihre .go-Dateien, einschließlich mypack_test.gogo build
wird dann in die Root-Ebene pkg und bin bauen.Ihr GOPATH könnte also so aussehen:
export GOPATH=$HOME/projects
Update: wie von> = Go 1.11, das Modulsystem ist jetzt ein Standardteil des Werkzeugs und das GOPATH Konzept ist in der Nähe obsolet zu werden.
quelle
~
beim Festlegen von Umgebungsvariablen erweitert , ebenso wie beispielsweise die Busybox-Bourne-Shell. Probieren Sie es aus:export BOB=~ && env | grep ^BOB
wird nachgebenBOB=/your/homedir
$HOME
arbeitet dann in mehr Muscheln~
, zum Beispiel infish
jdi hat die richtigen Informationen bezüglich der Verwendung von
GOPATH
. Ich würde hinzufügen, dass Sie, wenn Sie auch eine Binärdatei haben möchten, möglicherweise eine zusätzliche Ebene zu den Verzeichnissen hinzufügen möchten.Durch Ausführen
go build myproj/mypack
wird dasmypack
Paket zusammen mit den Abhängigkeiten erstellt. Durch Ausführengo build myproj/myapp
wird diemyapp
Binärdatei zusammen mit den Abhängigkeiten erstellt, die wahrscheinlich diemypack
Bibliothek enthalten.quelle
Ich habe eine Reihe von Go-Projekten studiert und es gibt einiges an Abwechslung. Sie können feststellen, wer von C und wer von Java kommt, da der erstere Speicherauszug fast alles im Stammverzeichnis des Projekts in einem
main
Paket enthält und der letztere dazu neigt, alles in einsrc
Verzeichnis zu stellen. Beides ist jedoch nicht optimal. Beide haben Konsequenzen, da sie sich auf Importpfade auswirken und darauf, wie andere sie wiederverwenden können.Um die besten Ergebnisse zu erzielen, habe ich den folgenden Ansatz ausgearbeitet.
Wo
mypack.go
istpackage mypack
undmain/mypack.go
ist (offensichtlich)package main
.Wenn Sie zusätzliche Unterstützungsdateien benötigen, haben Sie zwei Möglichkeiten. Bewahren Sie sie entweder alle im Stammverzeichnis auf oder speichern Sie private Supportdateien in einem
lib
Unterverzeichnis. Z.BOder
Legen Sie die Dateien nur in einem
lib
Verzeichnis ab, wenn sie nicht von einem anderen Projekt importiert werden sollen. Mit anderen Worten, wenn es sich um private Supportdateien handelt. Das ist die Idee dahinter,lib
öffentliche von privaten Schnittstellen zu trennen.Wenn Sie die Dinge auf diese Weise
myproj.org/mypack
ausführen , erhalten Sie einen schönen Importpfad, um den Code in anderen Projekten wiederzuverwenden. Wenn Sie verwenden, habenlib
interne Support-Dateien einen Importpfad, der darauf hinweistmyproj.org/lib/mysupport
.Verwenden Sie beim Erstellen des Projekts
main/mypack
zgo build main/mypack
. Wenn Sie mehr als eine ausführbare Datei haben, können Sie diese auch unter trennen,main
ohne separate Projekte erstellen zu müssen. zBmain/myfoo/myfoo.go
undmain/mybar/mybar.go
.quelle
cmd/nameOfMyExecutable
Unterverzeichnisses für das Hauptpaket (nur erforderlich,cmd/…
wenn Sie mehrere Befehle haben; siehegolang.org/x/tools/cmd
; ansonsten ist es üblich, es auszutauschen undmain.go
auf der obersten Ebene zu haben). So wie Sie es haben,go install
wird eine ausführbare Datei "main" (oder "main.exe") erstellt. Idiomatisch ist es auch, eininternal
Unterverzeichnis für ein Unterpaket innerhalb des Pakets / Programms zu verwenden, das nicht für andere Zwecke verwendet werden soll (es wird erwartet, dass zukünftige Versionen von Go niemanden dazu zwingen werden,internal
Pakete auf diese Weise zu importieren ).Ich finde es sehr nützlich zu verstehen, wie man Code in Golang in diesem Kapitel http://www.golang-book.com/11 des Buches von Caleb Doxsey organisiert
quelle
Es scheint keine Standardmethode zum Organisieren von Go-Projekten zu geben, aber https://golang.org/doc/code.html gibt eine bewährte Methode für die meisten Projekte an. Die Antwort von jdi ist gut, aber wenn Sie Github oder Bitbucket verwenden und zusätzliche Bibliotheken haben, sollten Sie die folgende Struktur erstellen:
Auf diese Weise können Sie ein separates Repository für mylib einrichten, das für andere Projekte verwendet und über "go get" abgerufen werden kann. Ihr mypack-Projekt kann Ihre Bibliothek über "github.com/username/mylib" importieren. Für mehr Informationen:
http://www.alexvictorchan.com/2014/11/06/go-project-structure/
quelle
Bewahren Sie die Dateien im selben Verzeichnis auf und verwenden Sie sie
package main
in allen Dateien.Dann renne:
quelle
Lassen Sie uns untersuchen, wie der
go get repository_remote_url
Befehl die Projektstruktur unter verwaltet$GOPATH
. Wenn wir ago get github.com/gohugoio/hugo
wird das Repository unter geklontDies ist eine gute Möglichkeit, Ihren ersten Projektpfad zu erstellen . Lassen Sie uns nun untersuchen, welche Projekttypen es gibt und wie ihre inneren Strukturen organisiert sind. Alle Golang-Projekte in der Community können unter kategorisiert werden
Libraries
(keine ausführbaren Binärdateien)Single Project
(enthält nur 1 ausführbare Binärdatei)Tooling Projects
(enthält mehrere ausführbare Binärdateien)Im Allgemeinen können Golang-Projektdateien nach beliebigen Entwurfsprinzipien wie DDD , POD gepackt werden
Die meisten verfügbaren Go-Projekte folgen diesem paketorientierten Design
Paketorientiertes Design ermutigt den Entwickler, die Implementierung nur in seinen eigenen Paketen zu belassen, außer in dem
/internal
Paket, das diese Pakete nicht miteinander kommunizieren könnenBibliotheken
/internal
Paket wird hauptsächlich verwendet, um die Implementierung vor anderen Projekten zu verbergen.Einzelprojekt
Werkzeugprojekte
cmd/
Paket verwaltet die Anzahl der Binärdateien (Tools), die wir erstellen möchtenquelle