2016-06-01 8 views
2

Meine Organisation verwendet Rails, um seine App zu entwickeln, aber ich versuche, einen unserer Back-End-Prozesse in Golang neu zu schreiben, weil es viel schneller ist.Golang-Projektstruktur in einer Anwendung im Vergleich zu einem Paket

Ich habe meine Anwendung mit unserer Firma einen Namespace für meine App (example.co) und einen Unterordner für jedes der Pakete innerhalb meiner App strukturiert.

Jede Bibliothek, die ich eingeschlossen habe (z. B. sqlx, etc ...) hat auch einen eigenen Ordner.

src/ 
    github.com/ 
    jmoiron/ 
     (sqlx package files) 
    example.co 
    my_app/ 
     (my app package files) 
    model/ 
     (model package files...) 

However looking at other packages like sqlx, es scheint, dass sie diese Verzeichnisstruktur Schrott und alle vollständig ihre Dateien im Stammverzeichnis setzen

Ist das, weil ich eine Anwendung Ich schreibe und SQLX ist ein Paket, das aufgenommen zu werden ist gemeint, in andere Anwendungen? Oder ist es nur ein Unterschied in der Vorliebe, da es keinen wirklich akzeptierten "Standard" gibt

+1

Lesen Sie https://golang.org/doc/code.html, wenn Sie dies noch nicht getan haben. Das sqlx-Paket wurde mit Hilfe von 'go get' installiert. Die Verzeichnisstruktur vom Stammverzeichnis im GOPATH bis zum 'sqlx'-Verzeichnis wird mit' go get' erstellt. Ich empfehle Ihnen, Ihren Go-Arbeitsbereich zu konfigurieren (indem Sie GOPATH einstellen), "go get github.com/jmoiron/sqlx" auszuführen und sich die resultierende Verzeichnisstruktur anzusehen. –

Antwort

4

Ich tat dies auch bei meinem ersten Projekt. Ich habe da gelernt:

  • die $GOPATH/bin/ pkg/ src/ Layout wird durch go get und ähnliche Befehle konstruiert
  • Sie können Ihre .go Dateien als einzelne flache Projektverzeichnis oder mit Unterordnern (caveat organisieren: alle .GO Dateien im selben Ordner müssen den gleichen Paketnamen haben)
  • setzen Code anderer Leute in einem /vendor Verzeichnis in Ihrem Projektstamm, wenn es Code Ihrer App muss, ist die Arbeit (google dies, dann ist es der schlimmste Teil gehen imo)
  • setzen sie Ihre eigenes Projekt unter Ihrem gopath, Symlink zu ihm, wenn Sie es zugänglicher wünschen

So würde ich Ihren Code vorstellen, etwas aussehen könnte:

/Users/user2490003/MyGoPath/ 
▾ src/github.com/user2490003/myproject/ 
    ▾ model/ 
     user.go 
    ▾ myapp/ 
     myapp.go 
    ▾ vendor/github.com/jmoiron/sqlx/ 
     sqlx.go 
    main.go 

Import die volle Paket Referenzen, wie folgt aus:

// main.go 
package main 
import (
    github.com/jmoiron/sqlx 
    github.com/user2490003/myproject/myapp 
    github.com/user2490003/myproject/model 
) 
+0

Danke für die detaillierte Erklärung. War es ein Vergleich, ob eine Verzeichnisstruktur wie die, die ich derzeit habe, im Vergleich zu einer flachen Verzeichnisstruktur besser ist, je nachdem, welche Art von Anwendung Sie entwickeln? – user2490003

+0

@ user2490003 Meine persönliche Präferenz ist für Ordner, obwohl eine flache Struktur bedeutet, dass Sie nie verloren gehen werden. Denken Sie daran, dass verschiedene Pakete unterschiedliche Ordner benötigen. Ich kann nicht sagen, entweder ist "besser" – Plato

2

ich empfehlen würde mit einem Layout zu starten, scheint logisch und funktioniert im gegenwärtigen Moment und dann umstrukturieren/restrukturieren wie benötigt, wenn Ihre Anwendungen wächst und entwickelt.

Ihr Unternehmen Namespace ist vernünftig - Ich würde ein Verzeichnis für Ihre App unter ihm (wie company.co/my_app) und im Inneren davon, Verzeichnisse für Bibliothek Erstellen von Paketen (beispielsweise company.co/my_app/db etc.) sowie die cmd ein das würde Verzeichnisse für die tatsächlichen ausführbaren Programme (package main Programme) enthalten, die Sie erzeugen möchten: cmd/exe1, cmd/exe2 etc. Dies wird Ihnen erlauben, mehrere ausführbare Dateien sowie mehrere Bibliothek "Unterpakete" innerhalb der my_app, die sein können unabhängig mit dem entsprechenden Importpfad enthalten.

Jede Bibliothek, die ich eingeschlossen habe (z. B. sqlx, etc ...) hat auch einen eigenen Ordner.

Wenn Sie sind ok mit der neuesten Version von Abhängigkeiten von Github verwenden, müssen Sie nicht den Code in Ihre Repositories Abhängigkeiten enthalten, sondern sie Bereich mit go get in den Build installieren.Wenn Sie aus einer lokalen Kopie erstellen möchten - und für die Verwendung in Unternehmen - sollten Stabilität und Überwachungsverfolgung bevorzugt werden - sollten Sie sie in ein Unterverzeichnis vendor einfügen, z. B. company.co/my_app/vendor/github.com/jmoiron/sqlx. Auf diese Weise haben Sie die Kontrolle darüber, wann Sie auf eine neuere Version der Abhängigkeiten aufrüsten, und versichern, dass die Upstream-Änderungen Ihren Build nicht beeinträchtigen oder Ihre Programme ohne Ihr Wissen beeinträchtigen und bis Sie die Möglichkeit haben, gründliche Tests durchzuführen.

Verwandte Themen