it-swarm.com.de

Ist es eine schlechte Idee, Quellcode für ein Go-Projekt außerhalb von GOPATH zu haben?

Ich arbeite mit Go an einem neuen Projekt, und wir sind alle neu in Go. Wir folgen der Standard-Go-Verzeichnisstruktur und haben den gesamten Code unter

$ GOPATH/src/github.com/Firmenname/Projektname

das ist auch die Wurzel eines Git-Repositorys

Das empfohlene Standardpfadlayout erscheint etwas seltsam, insbesondere wenn wir an einem mehrsprachigen Projekt arbeiten, z. ein Go-basiertes Rest/http-Backend und ein HTML/Javascript-Frontend. In diesem Fall möchte ich wahrscheinlich, dass meine Projektstruktur folgendermaßen aussieht:

/
  doc/
  src/
    server/
      main.go
      module1/
        module.go
    client/
      index.html
  Makefile

Aber ist es tatsächlich notwendig, den Code im GOPATH zu platzieren?

Als Versuch habe ich ein kleines Programm erstellt, bei dem sich der Quellcode außerhalb des GOPATH befand. Ich könnte das Projekt leicht in Pakete aufteilen, so dass das main -Paket mit foo/ Auf ein foo -Paket in einem import "./foo" - Ordner verweisen könnte.

Soweit ich sehen kann, gibt es zwei Dinge, die mir dies verbieten:

  • Anderer Code kann diesen Code nicht importieren. Dies ist kein Problem, da wir einen Service speziell für das Unternehmen aufbauen.
  • Ich kann go install Nicht verwenden, um es zu installieren. Dies ist auch kein Problem. Die Build-Pipeline installiert das Tool.

Es erlaubt dem Build-Server jedoch, dass sich sein Arbeitsbereich nicht im GOPATH befindet

Wird von einem solchen Ansatz abgeraten? Wenn ja, warum?

Gibt es andere negative Nebenwirkungen als die beiden, die ich aufgelistet habe?

Denken Sie daran, dass dies ein privates Projekt für ein Unternehmen ist, kein öffentlicher Open Source Code.

Das eigentliche Projekt vom GOPATH zu trennen scheint verlockend, aber man sollte vorsichtig sein, wenn man die Regeln bricht, wenn man sich auf der Sh Bühne befindet

34
Pete

pdate 2019

Sie müssen Ihr Projekt nicht mehr unter GOPATH speichern.

Legen Sie es in einem Verzeichnis außerhalb von GOPATH ab. Geben Sie dann Folgendes ein:

go mod init github.com/youruser/yourproject

Du wirst gut sein zu gehen.

5
Inanc Gumus

Sie müssen GOPATH nicht verwenden, aber dann verpassen Sie alle Nice-Werkzeuge, die Sie mit dem Befehl go erhalten. Sie alle erwarten, dass sich der Code in der Standard-GOPATH-Hierarchie befindet.

Du erwähntest go install, aber auch go test (und das Nizza go test -cover Coverage Tool) funktioniert nicht go get, mit dem Sie Remote-Code herunterladen können, schreibt alles in den GOPATH, sodass Sie die Dinge kopieren müssen.

Sicher, Sie können alles durch make/scons/cmake/Whatever ersetzen und Dinge erledigen, und es wird wahrscheinlich für Ihre Umgebung funktionieren, aber es ist zusätzliche Arbeit, die mit dem Tool go erledigt werden könnte.

13
iccananea

(Haftungsausschluss: Ich entwerfe gerne solche Sachen, aber ich bin neu in Go, ich habe es in der Praxis nicht ausprobiert.)

Idee: Warum nicht beides?

Wenn Sie Symlinking berücksichtigen, stehen zwei polare Optionen zur Verfügung:

(A) Code in src, der mit dem Arbeitsbereich verknüpft ist

/
  doc/
  src/
    server/
      projectname/
    client/
      index.html
  go_workspace/
    src/
      companyname/
        projectname -> ../../../src/server/projectname
      github.com/
        someone/
          library/
    bin/
    pkg/
  Makefile

(B) Code im Arbeitsbereich, der mit src verknüpft ist

/
  doc/
  src/
    server/
      projectname -> ../../go_workspace/src/companyname/projectname
    client/
      index.html
  go_workspace/
    src/
      companyname/
        projectname/
      github.com/
        someone/
          somelib/
    bin/
    pkg/
  Makefile

Ich würde mich zu "A" neigen, weil:

  • alle Ihre Quellen leben physisch eng zusammen.
  • projectname kann leicht ein eigenes Repo haben, oder Sie können ein Repo für Ihr gesamtes Projekt haben,
  • du kannst ganz bleiben go_workspace unversioniert und initialisiere es durch einen make-Schritt (benutze godep und verknüpfe dann das Projekt)
9
Kos