web-dev-qa-db-de.com

Was ist eine bewährte Methode für Go-Arbeitsbereiche?

Ich fange gerade an, Go zu lernen und vorhandenen Code zu lesen, um zu erfahren, "wie andere es tun". Dabei scheint die Verwendung eines "Arbeitsbereichs" von go, insbesondere in Bezug auf die Abhängigkeiten eines Projekts, allgegenwärtig zu sein.

Was ist (oder gibt es) eine bewährte Methode, wenn Sie einen oder mehrere Go-Arbeitsbereiche verwenden (Definitionen von $ GOPATH), während Sie an verschiedenen Go-Projekten arbeiten? Sollte ich davon ausgehen, dass es einen einzigen Go-Arbeitsbereich gibt, der sozusagen ein zentrales Repository für Code für alle meine Projekte ist, oder explizit aufteilen und $ GOPATH einrichten, während ich an jedem dieser Projekte arbeite (eine Art Python)? virtualenv)?

41
heckj

Ich denke, es ist einfacher, pro Projekt einen $GOPATH zu haben. Auf diese Weise können Sie verschiedene Versionen desselben Pakets für verschiedene Projekte verwenden und die Pakete bei Bedarf aktualisieren.

Bei einem zentralen Repository ist es schwierig, ein Paket zu aktualisieren, da Sie dabei ein nicht zusammenhängendes Projekt beschädigen könnten (wenn das Paket-Update Änderungen oder neue Fehler enthält).

29
this.lau_

Ich habe früher mehrere GOPATHs benutzt - tatsächlich Dutzende. Das Wechseln zwischen Projekten und das Aufrechterhalten der Abhängigkeiten waren viel schwieriger, da für das Einspielen eines nützlichen Updates in einem Arbeitsbereich es erforderlich war, dass ich es in den anderen mache. Manchmal vergesse ich es, den Kopf zu kratzen, und wunderte mich, warum diese Abhängigkeit in einem Projekt funktioniert aber nicht noch einer. Fiasko.

Ich habe jetzt gerade one GOPATH und ich setze tatsächlich alle meine Dev-Projekte ein - Go or not -. Mit einem zentralen Arbeitsbereich kann ich jedes Projekt immer noch in seinem eigenen git-Repository (src/<whatever>) aufbewahren und bei Bedarf mithilfe von git-Verzweigungen Abhängigkeiten verwalten (in der Praxis sehr selten).

Meine Empfehlung: Verwenden Sie nur einen Arbeitsbereich oder vielleicht zwei (z. B. wenn Sie Arbeit und persönlichen Code separater halten müssen, obwohl die empfohlene Namenskonvention für Paketpfade dies für Sie tun sollte).

27
Matt

Es ist sehr praktisch, einen GOPATH für alle Ihre Projekte zu verwenden, aber ich finde, dass dies nur für meine persönlichen Projekte der Fall ist.

Ich verwende für jedes von mir gewartete Produktionssystem einen separaten GOPATH, da ich in jedem GOPATH-Verzeichnisbaum git-Submodule zum Einfrieren von Abhängigkeiten verwende.

So etwas wie:

~/code/my-project
- src
  - github.com
    + dependency-one
    + dependency-two
    - my-org
      - my-project
        * main.go
        + package-one
        + package-two
- pkg
- bin

Wenn Sie GOPATH auf ~/code/my-project setzen, verwendet es die git-Untermodule Dependency-One und Dependency-Two innerhalb dieses Projekts, anstatt globale Abhängigkeiten zu verwenden.

6
Collin Van Dyck

Versuchen Sie envirius (universeller Manager für virtuelle Umgebungen) . Es ermöglicht das Kompilieren einer beliebigen Version von go und das Erstellen einer beliebigen Anzahl von darauf basierenden Umgebungen. $GOPATH/$GOROOT hängt von der jeweiligen Umgebung ab.

Außerdem können Umgebungen mit gemischten Sprachen erstellt werden (z. B. python & go in einer Umgebung).

5
shorrty

In meiner Firma habe ich Virtualgo erstellt, um das Verwalten mehrerer GOPATHs super einfach zu machen. Ein paar Vorteile gegenüber der manuellen Handhabung sind:

  • Automatisches Umschalten auf die korrekte GOPATH, wenn Sie cd zu einem Projekt wechseln.
  • Es lässt sich gut in Verkaufsgeräte integrieren
  • Außerdem wird das neue GOBIN in Ihrem Pfad festgelegt, sodass Sie die dort installierten ausführbaren Dateien verwenden können.
  • Ihre ursprüngliche GOPATH ist immer noch als Backup vorhanden. Wenn ein Paket nicht im projektspezifischen Arbeitsbereich gefunden wird, wird das Hauptverzeichnis GOPATH durchsucht.
4
JelteF

Wenn Sie GOPATH einfach auf $HOME/go oder ähnliches setzen und mit der Arbeit beginnen, funktioniert alles sofort und ist sehr einfach.

Wenn Sie viele GOPATHs mit vielen bin dirs für viele Projekte mit vielen gemeinsamen Abhängigkeiten in verschiedenen Frischezuständen erstellen, sind Sie, wie es offensichtlich sein sollte, die Sache selbst schwieriger. Das ist nur mehr Arbeit.

Wenn Sie feststellen, dass Sie gelegentlich einige Dinge isolieren müssen, können Sie für diese Situation eine separate GOPATH erstellen.

Aber im Allgemeinen, wenn Sie mehr Arbeit finden, liegt das oft daran, dass Sie die Sache schwerer machen.

Ich habe das, was 100 Projekte angehen muss, die ich in den letzten vier Jahren gesammelt habe. Ich arbeite fast immer in GOPATH, das ist $HOME/go auf meinen Computern.

4
Dustin

Ein Arbeitsbereich + godep ist am besten für mich. 

1
Fedir Tsapana

Möglicherweise möchten Sie das Paket direnv ausprobieren.

https://direnv.net/

0
sjas